在JavaScript并非所有的一切都是对象_基础知识

虽然很多语言宣称:“一切皆是对象”,但是 javascript 中,并不是所有的值都是对象。

原始值 vs 对象
javascript 中的值可以被划分为两大类:原始值(primitive)和对象(object)。

定义
javascript 的两种值的定义:

下面的值是原始值。

1.字符串
2.数字:在 JavaScript 中所有的数字都是浮点数
3.布尔值
4.null
5.undefined

所有其它的值都是对象(object)。对象可以进一步划分:

1.原始值的包装器:Boolean, Number, String。很少直接使用。

2.用字面量创建的对象。 下面的字面量产生对象,也可以通过构造函数创建对象。您可以使用字面量创建对象。

•[] 就是 new Array()
•{} 就是 new Object()
•function() {} 就是 new Function()
•/\s*/ 就是 new RegExp("\\s*")
3.日期:new Date("2011-12-24")

区别
您可以通过枚举的原语和定义对象非原语定义原语和对象。 但你也可以描述的原语和对象是什么。 让我们开始与对象。

1.对象是可变的:

复制代码 代码如下:

> var obj = {};
> obj.foo = 123; // 添加属性和值
123
> obj.foo // 读属性,返回属性的值
123

2.每个对象都有自己唯一的标识符,因此通过字面量或构造函数创建的对象和任何其他对象都不相等,我们可以通过 === 进行比较。

复制代码 代码如下:

> {} === {}
false

对象是通过引用来比较的,只有两个对象有相同的标识,才认为这个对象是相等的。

复制代码 代码如下:

> var obj = {};
> obj === obj
true

3.变量保存了对象的引用,因此,如果两个变量应用了相同的对象——我们改变其中一个变量时,两一个也会随之改变。

复制代码 代码如下:

> var var1 = {};
> var var2 = var1;

> var1.foo = 123; // 修改变量 val1 的属性
123
> var2.foo // val2 也改变了
123

正如预期的那样,原始值和对象不一样:

1.原始值是不可变的;你不能给它们添加属性:

复制代码 代码如下:

> var str = "abc";
> str.foo = 123; // 添加属性(此操作将被忽略)
123
> str.foo // 读属性的值,返回 undefined
undefined

2.原始值没有内部标识,原始值是按值比较的: 比较两个原始值的依据是他们的内容,如果两个原始值的内容相同,这认为这两个原始值相同。

复制代码 代码如下:

> "abc" === "abc"
true

这意味着,一个原始值的标识就是它的值,javascript 引擎没有为原始值分配唯一标识。

最后两个事实结合起来的意思是:我们无法区分一个变量到底是对象的引用,还是原始值的副本。

陷阱:原始值和它们的包装类型
规则:忽略尽可能多的包装类型。 在其他编程语言如Java,你很少会注意到他们。

原始值类型 boolean, number 以及 string 都有自己对应的包装类型 Boolean, Number 和 String。 包装类型的实例都是对象值,两种类型之间的转换也很简单:

•转换为包装类型:new String("abc")
•转换为原始类型:new String("abc").valueOf()
原始值类型以及它们相应的包装器类型有很多不同点,例如:

复制代码 代码如下:

> typeof "abc"
'string'
> typeof new String("abc")
'object'

> "abc" instanceof String
false
> new String("abc") instanceof String
true

> "abc" === new String("abc")
false

包装类型的实例是一个对象,因此和 JavaScript 和对象一样,包装类型也无法进行值的比较(只能比较引用)。

复制代码 代码如下:

> var a = new String("abc");
> var b = new String("abc");
> a == b
false // 虽然 a 和 b 有相同的内容,但是依然返回 false
> a == a
true

原始值没有自己的方法
包装对象类型很少被直接使用,但它们的原型对象定义了许多其对应的原始值也可以调用的方法。 例如,String.prototype 是包装类型 String 的原型对象。 它的所有方法都可以使用在字符串原始值上。 包装类型的方法 String.prototype.indexOf 在 字符串原始值上也有,它们并不是两个拥有相同名称的方法,而的的确确就是同一个方法:

复制代码 代码如下:

> "abc".charAt === String.prototype.charAt
true

在数字的包装类型 Number 的原型对象有 toFixed 方法,即 Number.prototype.toFixed,但是当我们写如下代码时却发生错误:

复制代码 代码如下:

> 5.toFixed(3)
SyntaxError: Unexpected token ILLEGAL

此错误是解析错误(SyntaxError),5 后面跟着一个点号(.),这个点被当作了小数点,而小数点后面应该是一个数,以下代码可以正常运行:

复制代码 代码如下:

> (5).toFixed(3)
"5.000"
> 5..toFixed(3)
"5.000"

值的分类:typeof 和 instanceof
如果你想要对值进行分类,你需要注意原始值和对象之间的区别。 typeof 运算可以用来区分原始值和对象。instanceof 可以用来区分对象,而且,instanceof 对于所有的原始值都返回 false。

typeof
typeof 可以用来判断原始值的类型,以及区分对象值和原始值:

复制代码 代码如下:

> typeof "abc"
'string'
> typeof 123
'number'
> typeof {}
'object'
> typeof []
'object'

typeof 返回以下字符串:

参数 结果
undefined "undefined"
null "object"
布尔值 "boolean"
数字 "number"
字符串 "string"
函数 "function"
其他 "object"

注释:

•typeof 在操作 null 时会返回 "object",这是 JavaScript 语言本身的 bug。不幸的是,这个 bug 永远不可能被修复了,因为太多已有的代码已经依赖了这样的表现。这并不意味着,null 实际上就是一个对象[4] 。

•typeof 还可以让检查一个变量是否已声明,而不会抛出异常。 没有任何一个函数可以实现此功能,因为你不能把一个未声明的变量传递给函数的参数。

复制代码 代码如下:

> typeof undeclaredVariable
'undefined'
> undeclaredVariable
ReferenceError: undeclaredVariable is not defined

•函数也是对象类型;这可能是很多人无法理解的,但有时候却是非常有用的。

•数组是一个对象。

更多关于 typeof 的信息 [5] 和 [6]。

instanceof
instanceof 可以检测一个值是否是某个构造函数的实例:

复制代码 代码如下:

value instanceof Constructor

如果上面的表达式返回 true,则表示 value 是 Constructor 的一个实例。它等价于:

复制代码 代码如下:

Constructor.prototype.isPrototypeOf(value)

大多数对象是 Object 的实例,因为原型链的末端(prototype chain)是 Object.prototype。 原始值不是任何对象的实例:

复制代码 代码如下:

> "abc" instanceof Object
false
> "abc" instanceof String
false

时间: 2024-10-30 03:12:32

在JavaScript并非所有的一切都是对象_基础知识的相关文章

JavaScript学习笔记(二) js对象_基础知识

1.简单类型 javascript的简单类型包括 数字(Number).字符串(String).布尔值(Boolean).null值 和 undefined值.其他所有值都是对象. 2.对象 javascript中的对象是可变键控集合.在javascript中,数组.函数.正则表达式都是对象. 对象是属性的容器.其中每个属性都拥有名字和值.属性的名字可以是包括空字符串在内的任意字符串.属性值可以是除undefined值之外的任何值. 3.对象的定义方法 (1)用字面量定义.例如: var obj

JavaScript入门教程(9) Document文档对象_基础知识

描述当前窗口或指定窗口对象的文档.它包含了文档从<head>到</body>的内容. 用法:document (当前窗口) 或 <窗口对象>.document (指定窗口) 属性: document.title //设置文档标题等价于HTML的<title>标签 document.bgColor //设置页面背景色 document.fgColor //设置前景色(文本颜色) document.linkColor //未点击过的链接颜色 document.a

javascript学习笔记(八) js内置对象_基础知识

1.URI方法 encodeURI()和encodeURIComponent()对URI进行编码 encodeURI()不会对本身属于URI的特殊字符进行编码,如冒号,正斜杠,问好,井字等 encodeURIComponent()会对任何非标准字符进行编码 2.eval() 方法:解释参数中的代码字符串 复制代码 代码如下: var msg = "hello world"; eval("alert(msg)"); //"hello world"

详细谈谈javascript的对象_基础知识

javascript中有很多对象内容,挑几个感觉用的比较多的讲解. 在网上学习一些和看javascript的学习手册. 如果要这个手册的可以留言,看到了我就发给你.恩,接下来总结一下我自己对象进阶之路. 1.对象:    (1)javascript中的所有事件都是对象:字符串.数组.函数.....   (2)每个对象带有属性和方法.   (3)JS允许自定义对象. 2.自定义对象 :  (1)定义并创建对象实例.  (2)使用函数来定义对象,然后创建新的对象实例. 例(针对2-(1)): 方法1

javascript标签在页面中的位置探讨_基础知识

在制作网页的过程中,我们经常写类似下面的代码: [html] 复制代码 代码如下: <html> <head> <title>Example HTML Page</title> <script type="text/javascript" src="example1.js"></script> <script type="text/javascript" src=&qu

关于JavaScript的变量的数据类型的判断方法_基础知识

  虽然Javascript是弱类型语言,但是,它也有自己的几种数据类型,分别是:Number.String.Boolean.Object.Udefined.Null.其中,Object属于复杂数据类型,Object   由无序的键值对组成.其余几种都属于简单数据类型.注意:变量类型首字母大写,而变量值首字母是小写的.   JavaScript不支持自定义类型,所以JavaScript中的所有值都属于这六种类型之一.   要搞清楚一个变量是何种数据类型,就要使用typeof操作符了,注意,尤其要

JavaScript中的this关键字使用详解_基础知识

 和其它许多面向对象的语言一样,JavaScript 中也有 this 关键字,this 在函数中用来指向调用此方法的对象.实际编程中要判断 this 到底指向谁,一般可遵循以下原则:     如果该函数被 Function.call 或者 Function.apply 调用,那么 this 指向 call/apply 的第一个参数,如果参数是 null 或者 undefined,this 则指向全局对象(在浏览器中的话,全局对象就是 window 对象).     如果该函数被 Functio

Javascript核心读书有感之表达式和运算符_基础知识

表达式是javascript中的一个短语,javascript解释器会将其计算出一个结果.程序中常用量是最简单的一类表达式就是变量.变量名也是一种简单的表达式,它的值就是赋值给变量的值. 复杂的表达式是由简单的表达式组成的.比如数组访问表达式是由一个表示数组的表达式,方括号.一个整数表达式构成.它们所组成新的表达式运算结果是该数组特定位置的元素值.同样的函 数调用表达式由一个表示函数对象的表达式和0个多个参数表达式构成.将简单表达式组成复杂表达式最常用的方法就是运算符. 本章(本文)将讲解所有j

JavaScript高级程序设计(第3版)学习笔记6 初识js对象_基础知识

在房子里面可以放你想放的任意事物--如果你有足够的美学造诣,你甚至可以弄一个房中房试试--当然,为了方便管理,我们会给房子里存放的所有事物都会取上一个不重复的名字,比如医药房间里的各种药品名称.在ECMAScript中,你可以在对象中存放任意你想放的数据,同样,我们需要给存放的数据取一个名字--也就是对象的属性名,再存放各种数据.再看看ECMA-262中对象的定义:无序属性的集合,其属性可以包含简单数据类型值.对象或者函数. 进入对象,我开始有些激动了,说实话,让我想起做这系列学习笔记的最初原因