js中同名函数后面会覆盖前面的
js里面没有函数重载的概念,在其他语言中(如java),可以存在同名函数,只要传入的参数数量或者类型不同即可。
在js中,定义了两个同名函数后,后面的函数会覆盖前面定义的函数。
也就是说,前面定义的函数内容会被后面的函数内容覆盖,当你以为自己执行的是前面的函数内容时,其实执行的是后面的函数内容。
例子:
1 | <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
7void 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。
- 先立即执行匿名函数,输出Hello World!
- 匿名函数没有写return语句默认返回undefined,则输出未定义
定义函数的三种方法
在Javascript定义一个函数一般有如下三种方式:
- 函数关键字(function)语句:
function fnMethodName(x){alert(x);}
(最常用的方法) - 函数字面量(Function Literals):
var fnMethodName = function(x){alert(x);}
- 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
、===
、==
instanceof运算符希望左操作数是一个对象,右操作数表示对象的类(初始化对象的构造函数)。如果左侧的对象是右侧对象的实例,返回true,否则返回false。
例如:计算o instanceof f
首先计算f.prototype
,然后在原型链中查找o,找到返回true===
严格相等运算符:首先计算其操作数的值,然后比较这两个值,比较过程中没有任何类型转换==
相等运算符:如果两个操作数不是同一类型,那么会尝试进行一些类型转换,然后进行比较
(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
for-in
与for-of
可参考《ES6扩展 对象扩展》