深入浅出javascript学习笔记

弱类型的隐式转换:

32 + 32  // 64
“32” + 32 // “3232”
“32” – 32 // 0

#### 巧用+/-规则转换类型: ``` num – 0 // 把变量转换成数字 num + '' // 把变量转换成字符串型 ```

#### ==: ``` "1.23" == 1.23 // true; 0 == false // true null == undefined // true; new Object() == new Object() // false; [1,2] == [1,2] // false ```

#### ===: 1.先比较类型,类型不同,返回false 2.再比较值 ``` null === null // true undefined === undefined // true NaN ≠ NaN // == === 均不等

</br>
#### 类型检测

typeof function // "function"

typeof undefined // "undefined"

typeof new Object // "object"

typeof [1,2] // "object"

typeof NaN // "number"

typeof null // "object" 约定俗成


instanceof 主要判断Object类型
判断左操作数的原型链上

<br/>
<br/>


###三、语句
####1 block语句、var语句 
 1. 函数有作用域,但是for,if之类的循环是没有块级作用域的
 2. `var a = b = 1 // b在这里相当于创建了一个全局变量`
 &nbsp;正确的写法:`var a = 1, b = 1;`

function foo() {

var a = b = 1;

}

foo();

console.log(typeof a); // 'undefined';

console.log(typeof b); // 'number';

</br>

####2 函数、switch、循环
1.函数声明会被前置、函数表达式不会
例如:

f1(); // true

function f1() {

// do sth

return true;

}

f2(); // TypeError

var f2 = function() {

// do sth

};


2.for..in循环:
&nbsp;1、顺序不确定
&nbsp;2、enumerable为false时不会出现
&nbsp;3、for in会受原型链的影响(原型链上属性的enumerable为true的话,是会被显示出来的)

3.with语句会修改作用域
&nbsp;缺点:让Js引擎优化更难;可读性差;可被变量定义代替;严格模式下会被禁用
</br>

####3 严格模式
严格模式是一种特殊的运行模式,它修复了部分语言撒谎那个的不足,提供更强的错误检查,并增强安全性。
>1. 不允许是用with语句
>2. 不允许未声明的变量被赋值
>3. arguments变为参数的静态副本
>4. delete参数、函数名会报错
>5. delete不可配置的属性会报错
>6. 对象字面量重复属性名报错
>7. 禁止八进制字面量
>8. eval,arguments变为关键字,不能作为变量、函数名
>9. eval会独立作用域
>10. 一般函数调用this(不是对象的方法调用,也不使用apply/call/bind等修改this)指向null,而不是全局对象。若使用apply/call,当传入null或undefined时,this指向null或undefined,而不是全局对象。
>11. arguments.caller,arguments.callee被禁用
</br>