1. 单波浪线“~”:在函数的前面加上单波浪线,其作用是把函数声明转为表达式,使其立即执行。
// 第一种方式
(function a () {
console.log("123")
})();
// 第二种方式
~function a () {
console.log("123")
}();
// 第三种方式
function a () {
console.log("123")
}
a();
// 1 = 2 = 3,三者效果相同
2. 当一个字符串前面加上双波浪线“~~”时,具有强制类型转换的作用,目的是将字符串转为数字。
~~"1" // 1
~~"2.2" // 2
~~"-3.1" // -3
~~"1adf" // 0
~~"1,2,3" // 0
~~"1.2.3.4" // 0
~~{a:1} // 0
~~[1,2,3] // 0
~~function(){} // 0
请注意:
“~~” 和 Math.floor
的作用相同,都是对小数进行取整,同样的也可以作为数据类型转换,但是如果双波浪线后面的部分是 对象、数字与其他符号(仅限一个“.”以外)的组合、数组 和 函数 的话,均会返回 Int
类型的 0。
3. 引用类型 和 基本类型
引用类型: Object
/Array
/Function
;
基本类型: Number
/String
/Boolean
/Undefined
/Null
若变量 a = 引用类型
,那么变量 a
存储的是 引用类型
的地址指针;
若变量 b = 基本类型
,那么变量 b
存储的是 基本类型
的值;
那么,如下:
// 引用类型
var a = { a: 1, b: 2 };
var b = a;
console.log(b === a); // true
var c = { a: 1, b: 2 };
// 造成这个问题的产生是由于变量 a 和 c 均存储了 { a: 1, b: 2 } 的地址
// 而前后两次的初始化的值 { a: 1, b: 2 } 是不同的,是在在内存中存储在两个不同的地址。
console.log(a === c); // false
// 基本类型
var a = 1;
var b = a;
console.log(a === b); // true
var c = 1;
console.log(a === c); // true
这也就解释了为什么 React
在每次渲染时,如果对 props
中的某个属性赋值为引用类型的相同值,对于子组件 componentWillRecieveProps()
方法来说,该属性的前后两次的值不同的问题。