JS笔试遇到的知识点(2)

js中同名函数后面会覆盖前面的

js里面没有函数重载的概念,在其他语言中(如java),可以存在同名函数,只要传入的参数数量或者类型不同即可。

在js中,定义了两个同名函数后,后面的函数会覆盖前面定义的函数
也就是说,前面定义的函数内容会被后面的函数内容覆盖,当你以为自己执行的是前面的函数内容时,其实执行的是后面的函数内容。

例子

1
2
3
4
5
6
7
8
9
10
11
<script> 
var m= 1, j = k = 0;
function add(n) {
return n = n+1;
  }
y = add(m);
function add(n) {
return n = n + 3;
}
z = add(m);
</script>

例子结果:y和z的最终结果为:4,4
例子分析:由于函数声明提升,所以函数声明会提前,由于存在同名函数,后面的add函数将覆盖第一个add函数,所以两次调用add()返回的值是相同的


void关键词

  • void是一元运算符,它出现在操作数之前,操作数可以是任意类型,操作数会照常计算,但会忽略计算结果并返回undefined。由于void会忽略操作数的值,因此在操作数具有副作用的时候使用void来让程序更具语义。
  • void 作为运算符后面接的是表达式,void expression。而void(0)也是被当做void 0。如果直接void(),那么我觉得应该是把void当做函数使用了,但是**void() 是关键词,并不能作为函数使用,所以void ();会报SyntaxError,即“语法错误”。**。
    1
    2
    3
    4
    5
    6
    7
    void  0; //undefined
    void (0);//undefined
    void (); //SyntaxError 语法错误

    typeof 1; //'number'
    typeof (1);//'number'
    typeof (); //SyntaxError 语法错误

按位与运算&

&:位运算符 比较两个数字的二进制的数位,按位与运算中 相等为1,否则为0
例子
1&2返回的是0
计算过程:(注意是针对二进制的数位进行对比是否相等!!)
1=0001 ,2=0010,运算以后=0000, 转换为数字结果为0,故返回0。


返回值和输出值不一样

注意:返回值和输出值不是一种东西!
任何函数执行完一次,如果没有 return 返回值和声明变量接受返回值,都会立即消失,永远找不到值!(undefined)也就是说,没有写return语句的函数都会默认返回undefined。
相关题目

  1. 先立即执行匿名函数,输出Hello World!
  2. 匿名函数没有写return语句默认返回undefined,则输出未定义

定义函数的三种方法

在Javascript定义一个函数一般有如下三种方式:

  1. 函数关键字(function)语句function fnMethodName(x){alert(x);} (最常用的方法)
  2. 函数字面量(Function Literals): var fnMethodName = function(x){alert(x);}
  3. Function()构造函数var fnMethodName = new Function(‘x’,’alert(x);’)
    后两种都是把一个函数赋值给变量fnMethodName,而这个函数是没有名字的,即匿名函数(拉达姆函数)。
    类似于 var foo = function bar(){...} 这样的统一按第2种方法处理,即在函数外部无法通过 bar 访问到函数,因为这已经变成了一个表达式。

注意,Function()构造函数没有{}


几个常见的事件的方法

preventDefault() 取消事件默认行为(不是阻止事件冒泡),如阻止点击提交按钮时对表单的提交(click没有默认行为)
stopImmediatePropagation() 取消事件冒泡同时阻止当前节点上的事件处理程序被调用,影响当前的事件
stopPropagation() 取消事件冒泡,不影响事件
cancelBubbe() 取消事件冒泡
returnValue() 取消事件默认行为


this

IIFE(立即执行函数表达式)中的this指向window


null与undefined

null和undefined是不同的,但它们都表示“值的空缺”,判断相等运算符“==”认为两者是相等的(使用严格相等运算符“===”来区分它们则不等)


运算符instanceof=====

  1. instanceof运算符希望左操作数是一个对象,右操作数表示对象的类(初始化对象的构造函数)。如果左侧的对象是右侧对象的实例,返回true,否则返回false
    例如:计算o instanceof f
    首先计算f.prototype,然后在原型链中查找o,找到返回true

  2. ===严格相等运算符:首先计算其操作数的值,然后比较这两个值,比较过程中没有任何类型转换

  3. ==相等运算符:如果两个操作数不是同一类型,那么会尝试进行一些类型转换,然后进行比较
    (1)尽管null和undefined是不同的,但它们都表示“值的空缺”,两者往往可以互换,因此==运算符认为两者是相等的
    (2)NaN表示非数字值,特殊之处:它和任何值都不相等,包括自身。判断NaN的方法:x!=x返回true


JS继承方式

JavaScript实现继承共6种方式:
原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承。


转换为布尔值

0、“ ”、null、undefined转换为布尔型是false,其余都是true。


运算符优先级

+加号运算符优先级大于?:三目运算符。(具体可看20200109第六题)


ES6中promise的三种状态

  • 一个 promise 可能有三种状态:等待(pending)、已完成(Resolved,又称fulfilled)、已拒绝(rejected)
  • 一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
  • promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
  • then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。

数组

js中,数组会自动根据最大下标延长一位,既下标为n,则数组的长度为n+1。没有填值默认为undefinded


分母为0isNaN(1/0)

  • 任何 数值除以0 都会导致错误而终止程序执行。但是在 JavaScript 中,会返回出特殊的值,因此不会影响程序的执行
  • 比0大的数除以0,则会得到无穷大,所以 js 用 Infinity (无穷)来显示。
  • 也就是1/0得到的是Infinity。**isNaN(1/0)返回的是false。但是isNaN(0/0)返回的就是true**。

in操作符

(可参考MDN的in运算符

  • 如果指定的 属性 在指定的对象或其原型链中,则in 运算符返回true。
  • 如果指定的 数组索引 在数组中,则in 运算符返回true。
  • 1 in [1]并不是表示数字1在不在数组里。而是表示数组中含不含有1这个索引index值。
  • 数组长度为1,所以只含有的index值为0,1 in [1]返回fasle。

for-in 和 for-of

,