码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript类型&值&变量

时间:2016-05-13 00:12:12      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:

正零VS负零

两个值几乎一模一样,除了作为除数之外:

var zero = 0;       // 正零
var negz = -0;      // 负零
zero === negz;      // true
1/zero === 1/negz;  // false

《JavaScript权威指南》p.37

undefined VS null

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

对象转换成原始值

对象转换成字符串

对象转换成字符串的过程如下:

  • 首先调用toString(),如果返回一个原始值,则将这个原始值转换为字符串并返回。
  • 如果对象没有toString()方法,或者方法返回的不是原始值。则调用valueOf(),如果返回的是原始值,则将这个原始值转换为字符串并返回。
  • 如果上述2个方法都无法获取一个原始值,则抛出一个类型错误异常。

对象转换成数字

对象转换成数字的过程如下:

  • 首先调用valueOf(),如果返回一个原始值,则将这个原始值转换为数字并返回。
  • 如果对象没有valueOf()方法,或者方法返回的不是原始值。则调用toString(),如果返回的是原始值,则将这个原始值转换为数字并返回。
  • 如果上述2个方法都无法获取一个原始值,则抛出一个类型错误异常。

对象转换成布尔

对象转换成布尔类型:

  • 所有对象都转换为”true”。

对于所有非日期的对象来说,对象到原始值的转换基本上是对象到数字的转换(首先调用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

变量声明

函数作用域(function scope)

在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,变量被删除


作用域链(scope chain)

  • 作用域链是一个函数对象列表或链表,这组对象定义了这段代码”作用域中”的变量(闭包)。列表中对象的顺序为:局部对象、全局对象(后面变量解析的实现)。
  • 当JavaScript需要查找变量x的时候(这个过程称做“变量解析”variable resolution),它会从链中的第一个对象开始查找,如果这个对象有一个名为x的属性,则会直接使用这个属性的值,如果不存在,则会继续查找链上的下一个对象。
  • 定义一个函数时,它实际上保存一个作用域链。当调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加至保存的那个作用域链上,同时创建一个新的更长的表示函数调用作用域的”链”。

《JavaScript权威指南》p.56

JavaScript类型&值&变量

标签:

原文地址:http://blog.csdn.net/byrantch/article/details/51344788

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!