全局对象window
Number
如果包装成一个对象,就有一些操作1的函数可以调用。不包装成对象,就是一个1。
历史遗留问题
在实际操作中,n1也可以调用那些函数(n1不是对象,没有key,不可以调用函数),这是为什么呢:
原因:js之父在设计初期,为了满足js要长得像java的要求,设计了var n2 = new Number(1)
这种语法,但是大家都喜欢var n2 = 1
这种简单的语法,所以有一个临时转换方法:temp = new Number() temp.toString()
然后拿到值返回表达式之后将temp删除
小考题
①var n = 2①n.xxx = 1③n.xxx = ?//undefined复制代码
过程:
①首先在stack存储数值2
②新建一个temp对象在堆内存中,把temp的地址给n,temp增加一对key:value(n.xxx = 1),然后删除这个temp对象
③新建一个temp,将temp的地址给n,然后调取n.xxx,得到undefined
string
重点API
一:上面的是'a'的Unicode码,下边的是a的16进制的Unicode码
Boolean
小测试
公用属性(原型)
解释:原型就是共有属性 意义:不要浪费去声明同样的属性 方法:声明对象时,除了自定义的key,还有一个隐藏的key__proto__
,__proto__
去指向共有属性的地址
不同数据类型的__proto__
不同,但他们都是object的第二层
同一个数据类型有自己数据类型的共有属性(第二层),object的共有属性是所有类型的共有属性(最高层)
数据类型的共有属性的存储
object
object.prototype就是object的共有属性,他一直引用object的__proto
,避免了其被垃圾回收
number
树状图表示共有属性绑定
当声明一个对象的时候,js引擎就做了两件事:
1:创造一个hash
2:将xxx.__proto__
指向xxx.prototype
不写代码就有prototype
在不写代码的情况下,全局变量window下就拥有函数Nunber,String等等,他们的prototype指向一块共有属性,同时自己生成的对象的__proto__
也指向这一块共有属性
总结:String.prototype是string的共有属性的引用(防止垃圾回收),s1.__prototype__是String的共有属性的引用(因为s1真的要用这些属性啊)
烧脑的__proto__和prototype
Object.____proto____ === Function.prototype
,因为 Function 是 Object 的构造函数。
Object.prototype.__proto__
指向 null
总结
不能断章取义,__proto__
和 prototype 只是两个 key 而已 我们一般研究对象的__proto__
和函数的prototype 对象.__proto__
=== 某函数.prototype 如果把函数看成对象,那么函数.__proto__
=== Function.prototype 如果把 Function 看成对象,那么 Function.__proto__
=== Function.prototype
1toString() //报错,语法错误1.toString() //报错,JS引擎无法确定这里的`.`是什么意思,是点运算符(对象方法)还是浮点数?1..toString() //成功,运算结果"1" 解析: 第二个点被视为点运算符,前面的是浮点数。1.0.toString() //成功,运算结果"1" 解析: 第二个点被视为点运算符,前面的是浮点数。1 .toString() //成功,运算结果"1" 解析: 用空格和后面的.toString()隔开, 把前面的当成运算式处理1+2.toString() //报错,JS引擎无法确定这里的`.`是什么意思,是点运算符(对象方法)还是浮点数?1+2 .toString() //成功,运算结果"12" 解析: 用空格和后面的.toString()隔开, 把前面的当成运算式处理(1+2).toString() //成功,运算结果"3" 解析: 括号内部的先进行算法运算,在进行类型转换(1)+(2).toString() //运算结果"12" 解析: 括号内部进行类型修改并将数字n转换为字符串“n “,在进行拼接,然后再应用toString方法。(1)+(2)+0 .toString() //成功,运算结果"30" 解析: 如果有多个`+`号,且不包含中括号与""的情况下,则把最后一个加号之前的进行数学运算(不管他有没有被括号包住),最后一个加号留作拼接作用。(1)+(2)+0+(11) .toString() //成功,运算结果"311" 解析: 同上(1)+(2)+0+12 .toString() //成功,运算结果"312" 解析: 同上([1]+[2]+[3])+12 .toString() //成功,运算结果"12312" 解析: 如果里面只有方括号(单个数值的数组),则+起连接作用((1)+(2)+[3])+12+43 .toString()//成功,运算结果"331243" 解析: 如果里面包含圆括号,则先要进行运算,再把运算的结果与后面的内容拼接起来。(1)+(2)+6+2+5+"(15)"+1+0+(1) .toString() //成功,运算结果"16(15)101"解析: 如果字符串包裹的前面有多个加号,则把字符串双引号前面的进行运算(不管他有没有被圆括号包住),得到的数值拼接上字符串包裹的内容再拼接上之后的内容复制代码
var obj = { name: 'frank' } 请问 obj.toString 为什么不是 undefined?
因为 obj 以某种方式拥有了 toString 这个属性
obj 拥有 toString 的方式是用过 __proto__
达到的
obj.__proto__
存储了Object.prototype的地址(也就是引用关系)
obj.toString === Object.prototype.toString 为 true