作者:手机用户2502914287 | 来源:互联网 | 2023-09-13 10:31
JavaScript中,有七种内置范例:6种原始范例和援用范例,他们离别是:6种原始范例(基础范例):空值(null)未定义(undefined)布尔值(boolean)数字(nu
Javascript中,有七种内置范例:6种原始范例和援用范例,他们离别是:
6种原始范例(基础范例):
- 空值(null)
- 未定义(undefined)
- 布尔值(boolean)
- 数字(number)
- 字符串(string)
- 标记(symbol,ES6中新增)
援用范例:
范例推断
我们能够用typeof
运算符来检察范例的值:
typeof(undefined) //"undefined"
typeof('123') //"string"
typeof(123) //"number"
typeof(true) //"boolean"
typeof Symbol() //"symbol"
typeof({name:'oops'}) //"object"
typeof([1,2,3]) //"object"
我们注意到,null值并不在列,为何呢?这里比较特别:
typeof(null) //"object" , 这是js中的一个bug
我们应当运用准确的要领来推断null值的范例:
var a = null;
(!a && typeof a ==='object') //true
如今让我们来看另一个题目:什么是undefined?
答案是:变量在未持有值时,变量的范例为undefined。
为何我会在这里会零丁提出这个题目?由于许多开发人员把undefined
等同于undeclared(未声明)
,这是一个观念性的毛病。已在作用域中声明的变量但未赋值的,称为undefined;相反,还未在作用域中声明的变量,称为undeclared(未声明)。
举个栗子:
var a;
a; //undefined
c; //Uncaught ReferenceError: c is not defined
是不是是遽然邃晓了这两者的差异,BUT!!,请看这个栗子:
var a;
typeof a; //"undefined"
typeof b; //"undefined"
新鲜,变量b未在作用域中声明,为何不报错且typeof的值怎样照样undefined?那是由于typeof的一种特别的平安机制。应用这点,当我们用if前提语句推断某个变量是不是有值时,能够用这类要领。举个栗子:
//变量a未声明,以下体式格局会报错
if(a){
...
}
//变量a未声明,以下体式格局就是平安的
if( typeof a !== "undefined"){
...
}
so ,经由过程typeof搜检undeclared变量是个不错的要领。
基础范例(原始范例)
js中有六种基础范例,他们是:Undefined
、Null
、Boolean
、Number
、String
、Symbol (new in ES 6)
,基础范例的贮存体式格局为栈内存(Stack)贮存,下图所示。
由此得出以下三点结论;
- 基础范例的值是不可变的
- 基础范例的比较是它们的值的比较
- 基础范例的变量是存放在栈内存(Stack)里的
举个栗子:
var a = "oops";
b = a;
b; //"oops"
a = "哈哈";
a; //"哈哈"
b; //"oops" ,a值的转变不会影响b的值
援用范例
我们先来一个栗子看看援用范例是如安在盘算机内存储的:
var a ={};
var b;
a.name = "oops";
a.age = 24;
b = a;
console.log( b.age ); //24
a.name = "hz";
b.age = 18;
console.log( a.age ) //18
从这个例子中能够看出,援用范例的值是保留在堆内存(Heap)中的对象,栈内存保留变量的指针,堆内存中保留详细的对象。
做个小小的延长:
var a ={name:"hz"};
var b ={name:"hz"};
console.log( a == b ); //false
console.log( a === b ); //false
在这个栗子中,a,b两个对象都有一条雷同的值,但这两个对象却不相称,为何呢?由于
a ,b 两个对象离别援用的是存放在堆内存中的2个差别的对象,故变量 a和 b的值(援用地点)也是不一样的。
以上。
有毛病的处所愿望人人指出来,配合讨论。
参考资料:
【文章】 Javascript 深切相识基础范例和援用范例的值
【书本】 你不知道的Javascript(中卷) 第一章:范例