标签:
两个值几乎一模一样,除了作为除数之外:
var zero = 0; // 正零
var negz = -0; // 负零
zero === negz; // true
1/zero === 1/negz; // false
《JavaScript权威指南》p.37
undefined是变量未赋值前的默认值,表示未定义。typeof undefined = undefined.
null是空对象引用,表示对象为空。typeof null = object.
更多请参考
string.length()返回的是含有16位值的个数,而不是字符的个数。
var p = "π"; // 16位内码,0x03c0
var e = "e"; // 17位内码,0x1d452
p.length; // 1
e.length; // 2
《JavaScript权威指南》p.38
JavaScript中数据类型分为2种:原始类型和对象类型。
Number, String, Boolean, Null, Undefined为原始类型。
var s = "hello world!"; // s为原始类型String
var word = s.substring(2, 5); // 使用string的属性,word也是一个原始类型Stirng(可使用typeof进行测试)
字符串既然不是对象,为什么会有属性呢?
只要引用了字符串s的属性,JavaScript就会通过new String(s)方式转换成对象,一旦属性引用结束,这个新建的对象就会销毁。
var s = "test"; // 创建一个原始类型String
s.len = 4; // 创建了一个临时对象,并给临时对象添加一个属性,原始值s并没有变化
var t = s.len; // t为undefined,因为原始值并没有变化
var u = s.length; // u=4,因为临时对象string包含length属性
var s = "test"; // typeof(s) = string
var n = 1; // typeof(n) = number
var b = true; // typeof(b) = boolean
var S = new String(s); // typeof(S) = Object
var N = new Number(n); // typeof(N) = Object
var B = Boolean(b); // typeof(B) = Object
原始值:
var s = "hello"; // 定义一个原始类型string
s.toUpperCase(); // 返回临时对象"HELLO",并没有改变原始值s
s // 值还是hello
对象引用:
var o = { x:1 }; // 定义一个普通对象
o.x = 2; // 修改对象的属性值
o.y = 3; // 添加一个属性
var a = [1,2,3]; // 定义一个数组对象
a[0] = 0; // 修改数组的值
a[3] = 4; // 添加一个数组元素
var o = { x:1 }, p = { x: 1 }; // 定义2个具有相同属性的对象
o === p; // false,两个单独的对象不相等
var a = []; // 定义一个空数组对象
var b = a; // b与a引用同一个数组
b[0] = 1; // 修改数组的值
a[0]; // 1
a === b; // true,引用同一对象相等
《JavaScript权威指南》p.46
如果“+”运算符的一个操作数是字符串,它会将另外一个操作数转换为字符串。
一元”+”运算符(或”-“运算符)将其操作数转换为数字。
一元”!”运算符将其操作数转换为布尔值并取反。
x + ""; // 等价于Stirng(x)
+x; // 等价于Number(x),也可写成 [x - 0]
!!x; // 等价于Boolean(x),注意是双叹号
《JavaScript权威指南》p.50
对象转换成字符串的过程如下:
对象转换成数字的过程如下:
对象转换成布尔类型:
对于所有非日期的对象来说,对象到原始值的转换基本上是对象到数字的转换(首先调用valueOf()),日期对象则使用转换字符串的模式。
var bool = new Boolean(false);
alert(typeof(bool + 1)); // 布尔对象转换成数字,number
alert(typeof(bool - 1)); // number
alert(bool.toString()); // "false"
alert((1+bool).toString()); // 1
var now = new Date();
alert(typeof(now + 1)); // 日期对象转换成字符串,string
alert(typeof(now - 1)); // number
alert(now.toString()); // "Sun May 08 2016 08:57:47 GMT+0800"
alert((now + 1).toString()); // "Sun May 08 2016 08:57:47 GMT+08001"
《JavaScript权威指南》p.52
在C语言中,花括号内的每一段代码都有各自的作用域,我们称为块级作用域(block scope)。
而JavaScript中使用了函数作用域,指在函数声明内声明的所有变量在函数体内始终是可见的。
function test(o) {
var i = 0; // i在整个函数体内均有定义
if(typeof o == "object") {
var j = 0; // j在整个函数体内均有定义
for(var k=0; k < 10; k++) { // k在整个函数休内均有定义
console.log(k);
}
console.log(k); // 输出10
}
console.log(j); // j已经定义了,但可能还没有初始化
}
如果局部变量与全局变量重名,则全局变量会被局部变量覆盖。
var scope = "global";
function f() {
console.log(scope); // 输出"undefined",而不是"global"
var scope = "local"; // 局部变量初始化
console.log(scope); // 输出"local"
}
由于JavaScript没有块级作用域,所以可以将变量声明放在函数顶部,这样源代码能清晰地反映真实的变量作用域。
当声明一个全局变量时,实际上是定义了全局对象(this)的一个属性。
当使用var声明一个全局变量时,这个变量是不可配置的,也是说无法通过delete运算符删除。
如果没有使用var来声明,则这个全局变量是可配置的。
var truevar = 1; // 声明一个不可删除的全局变量
fakevar = 2; // 声明一个可删除的全局变量
this.fakevar2 = 3; // 同上
delete truevar; // false,变量并没有被删除
delete fakevar; // true,变量被删除
delete fakevar2; // true,变量被删除
《JavaScript权威指南》p.56
标签:
原文地址:http://blog.csdn.net/byrantch/article/details/51344788