若是你对下面的代码没有任何疑问就能自信的回答出输出的内容,那么本篇文章就不值得你浪费时间了。javascript
var var1 = 1 var var2 = true var var3 = [1,2,3] var var4 = var3 function test (var1, var3) { var1 = 'changed' var3[0] = 'changed' var3 = 'changed' } test(var1, var3) console.log(var1, var2, var3, var4)
原始类型有5个 Undefinded, Null, Boolean, Number, String
java
// 抬杠, 下面的length属性,toString方法怎么有属性和方法呢? var a = 'oooo' a.length a.toString
原始类型中,有三个特殊的引用类型Boolean
, Number
, String
,在操做原始类型时,原始类型变量会转换成对应的基本包装类型
变量去操做。参考JavaScript高级程序设计 5.6 基本包装类型。
node
因此说:在js中,也并非一切都是对象
git
原始类型的变量的值是不可变的,只能给变量赋予新的值。github
下面给出例子web
// str1 开始的值是aaa var str1 = 'aaa' // 首先建立一个能容纳6个字符串的新字符串 // 而后再这个字符串中填充 aaa和bbb // 最后销毁字符串 aaa和bbb // 而不能理解成在str1的值aaa后追加bbb str1 = str1 + 'bbb'
其余原始类型的值也是不可变的, 例如数值类型的。segmentfault
不是每个值都有地址,但每个变量有。
《Go程序设计语言》变量没有类型,值有。变量能够用来保存任何类型的值。
《You-Dont-Know-JS》变量都是有内存地址的,变量有用来保存各类类型的值;不一样类型的值,占用的空间不一样。数组
var a = 1 typeof a // 检测的不是变量a的类型,而是a的值1的类型
变量访问的方式有两种:微信
按值访问
按引用访问
在JS中,五种基本类型Undefinded, Null, Boolean, Number, String
是按照值访问的。基本类型变量的值就是字面上表示的值。而引用类型的值是指向该对象的指针,而指针能够理解为内存地址。wordpress
能够理解基本类型的变量的值,就是字面上写的数值。而引用类型的值则是一个内存地址
。可是这个内存地址,对于程序来讲,是透明不可见的。不管是Get仍是Set都没法操做这个内存地址。
下面是个示意表格。
语句 | 变量 | 值 | Get | 访问类型 |
---|---|---|---|---|
var a = 1 |
a | 1 |
1 | 按值 |
var a = [] |
a | 0x00000320 |
[] |
按引用 |
抬杠Undefinded, Null, Boolean, Number
是基本类型能够理解,由于这些类型的变量所占用的内存空间都是大小固定的。可是string
类型的变量,字符串的长短都是不同的,也就是说,字符串占用的内存空间大小是不固定的,为何string被列为按值访问呢?
基本类型和引用类型的本质区别是,当这个变量被分配
值时,它须要向操做系统申请内存资源,若是你向操做系统申请的内存空间的大小是固定的,那么就是基本类型,反之,则为引用类型。
var var1 = 1 var var2 = true var var3 = [1,2,3] var var4 = var3 function test (var1, var3) { var1 = 'changed' // a var3[0] = 'changed' // b var3 = 'changed' // c } test(var1, var3) console.log(var1, var2, var3, var4)
上面的js分为两个调用栈,在
changed
, 完全断了与外层v3联系。最终的输出:
1 true ["changed", 2, 3] ["changed", 2, 3]
看完两个stackoverflow上两个按照投票数量的榜单
若是学习有捷径的话,踩一遍别人踩过的坑,可能就是捷径。
扫码订阅个人微信公众号:洞香春天
。天天一篇技术短文,让知识再也不高冷。