==和===
==非严格相等 ===严格相等
===严格相等在比较前都不让进行 隐式转换
源码解析
jQuery的callbacks(异步回调的解决方案)
for (; queue.length; firingIndex = -1) {
memory = queue.shift();
while (++firingIndex < list.length) {
if (
list[firingIndex].apply(memory[0], memory[1]) === false &&
options.stopOnFalse
) {
// 这个if判断回调队列中是否有一个函数返回false,
//如果是,并且同时option的配置中有stopOnFalse这一个选项,
//那么就会停止后面的函数的执行
// 严格相等的作用是防止万一某个函数返回的是空字符串,
//那么==也会生效,这样就破坏了这个配置的设定
firingIndex = list.length;
memory = false;
}
}
}
但是并不能所有的地方都用严格相等,如果是这样的话,那么把隐式转换这种东西从语言中剔除就好啦,但是它存在就有它的意义。
例子:从input框中获取用户的手机号码,得到的是字符串,但是与我们预先设定好的号码进行比较时就要隐式转换。
&&和||
逻辑运算符
运算符 | 语法 | 说明 |
---|---|---|
逻辑与AND(&&) | expr1&&expr2 | 若expr1能够转换为true则返回expr2,否则返回expr1 |
逻辑或OR(||) | expr1||expr2 | 若expr1能够转换为true则返回expr1,否则返回expr2 |
逻辑非NOT (!) | !expr | 若expr能够转换为true则返回false,否则返回true |
会被转换成false的表达式有
- null
- NAN
- 0
- 空字符串(''或""或``)
- undefined
实际应用
function fn(callback){
callback&&calback();
// 看有没有传值,如果传进来了回调函数,那就执行这个函数,就不用if判断
}
var result1=expr1&&expr2
// 只有两个值都是true,result1的值才是true
var result2=expr1||expr2
// 只要有一个值为true,result2的值就是true
其实利用这两个逻辑表达式的规律,
- 逻辑与:只有前一个表达式为真,才会执行后一个表达式
- 短路操作:某一个表达式为假,就不会往后执行
- 逻辑或:从前往后, 只要有某一个表达式为真,那么就不会执行后一个表达式
- 短路操作:某一个表达式为真,就不会往后执行
prototype和proto
- prototype:函数对象才有的属性,把函数当成构造函数定义它的原型对象
- proto:任何对象都有的属性,指向自身构造函数的原型对象
百度js string,在w3school中有对对象的区分
对象的分类
对象的区分 | 简要说明 |
---|---|
内置对象 | js语言帮我们提供的对象例如array、Boolean、date对象,我们可以直接new出一个新实例,在w3school中就是JavaScript对象 |
宿主对象 | 在w3school中就是除了JavaScript对象的其他对象,都是由宿主环境帮我们提供的。像nodejs也会提供宿主对象 |
自定义对象 | 自己写构造函数,然后new出来的对象 |
思考:所有的数组对象都有slice方法[].slice(),那么为什么他们可以调用这些方法?