问题
人们经常会遇到诸如对象(object),基本类型(primitive)和字面值(literal)这样的术语,这三者之间有何区别。我们又如何分辨他们呢?
解决方案
一个JavaScript字面值表示某种特定类型的一个值,例如,一个引用的字符串(String)、浮点数(Number)或布尔值(Boolean):
"this is a string"
1.89
true
JavaScript基本类型是特定的数据类型的一个实例。JavaScript中有5种这样的类型:String、Number、Boolean、null和undefind。下面是JavaScript基本类型的一些例子;
"this is a string"
null
在这些基本数据类型中,有3个有对应的构造方法对象:String Number和Boolran。这些对象提供了对内建属性和方法的访问,允许我们做一些简单赋值和顺序访问之外的事情。
var str1 = "this is a string"
console.log(str1.length) //访问对象的length属性
申明一个变量的时候,我们就像是在操作简单的字符串或数字一样
var str1 = "this is a string"
然而,我们实际打开了通知一系列广泛功能的大门。如果不是依赖于JavaScript对象的话,我们可以给变量分配一个字符串,数字或布尔值。随后访问它,然而,如果我们要对变量做更多的事情的话,需要使用该数据类型所对应的JavaScript对象及其属性。例如如果想看一个字符串的长度,我们可以访问String对象的length属性
var str1 = "this is a string"
console.log(str1.length)
在幕后。当代码在一个字面值上访问一个String对象属性的时候。会创建一个新的String对象,并且其值设置为变量中所包含的字符串的值。访问并打印出length属性,并且丢掉新创建的String对象。实际上,JavaScript中确实有5个数据类型:字符串,数值,布尔类型,null,和undefind。只有字符串,数值,和布尔数据类型有对应的构造方法对象。字符串、浮点数、整数、和布尔值都是字面值:
var str1 = "this is a simple string"; //引号里面的字符串就是字面值
var num1 = 1.89; //1.89是字面值
var answer = true; //true 是字面值
我们可以使用一个字面值表示或使用该对象而不带new操作符、从而创建基本类型的布尔值、字符串和数字变量:
var str1 = String ("this is a string"); //基本类型字符串
var num1 = Number(1.89); //基本类型数字
var bool1 = Boolean(true); //基本类型布尔值
要有意实例化一个对象。用new操作符:
var str1 = new String("this is a string");
var num1 = new Number(1.88);
var bool1 = new Boolean(true);
当你使用严格相等来比较一个对象示例和一个字面值的时候,你可以快速区分一个基本类型和一个对象实例。
var str1 = String("string");
var num1 =Number("1.88);
var bool1 = Boolean(true);
if(str1=="string"){
console.log(‘equal‘)
}
if(num1==1.88){
sonsole.log(‘equal‘)
}
if(bool1==true){
console.log(‘equal‘)
}
var str2 = new String("string");
var num2 = new Number(1.88);
var bool2 = new Boolean(true);
if(str2=="string"){
console.log(‘not equal‘)
}
if(num2==1.88){
console.log(‘not equal‘)
}
if(bool2==true){
console.log(‘not equal‘)
}
输出结果如下:
equal
equal
equal
not equal
not equal
not equal
基本类型变量严格的等于字面值,而对象实例则不会。为什么基本类型变量严格地等于字面值呢?因为基本类型是根据值来比较的,而值是字面值。
大多时候,JavaScript开发者不会直接为3种基本数据类型创建对象实例,开发者只是想要像数字,布尔值或者字符串一样起作用的一个数值变量,布尔值或字符串变量。而不是先有一个对象,我们不需要对象的扩展功能,更为重要的是,当开发者在代码中使用严格相等性或类型检查的时候,他们想要与期望的数据类型一致的一个变量,而不是定义为一个"对象":
var num1 = 1.88;
var num2 =new Number(1.88);
console.log(typeof num1); //输出数字
console.log(typeof num2); //输出对象