js 传参怎么变对象key_js深入浅出之数据类型 -- 灵魂拷问1

1.原始数据类型和引用数据类型有哪些?

string number boolean null undefined symbol

7149c0afdd0d2083e9433fd98113cafb.png

symbol是ES6新引入的一种数据类型,表示独一无二的值。

c02290abe211b0b8592fdda1704d6f8e.png

注意,Symbol函数不能使用new生成实例,否则会报错。因为Symbol是一种原始数据类型的值,不是对象。也就是说 ,Symbol的值不是一个对象所以不能添加属性,是一种类似于字符串的数据类型。

2.typeof Array 和 typeof Array()?

aff40269110272145d97bcae4d8e40b1.png

Array本身是js内置的一个构造函数,构造函数不实例化也就是个函数。

当它在调用或实例化的时候typeof 才会成对象。

3.null是一个对象吗?为什么typeof null 为object?

null表示一个空指针,它不是一个对象。

因为js在最初的版本出于性能考虑使用的是低位存储变量的类型信息,000 开头代表是对象,而 null 全部表示为全0,所以会错误的判断为 object 。

接下来灵魂拷问篇 - 1:

相信大家在面试中、高级前端的时候经常会问到关于原型、原型链、作用域、作用域链、eventLoop机制、this指向等问题,结合这些知识点我们来分析下面的面试题:

NO.1

5df9a06db15bcdcc1d7853669c608872.png

答案是:"local scope" 简单的闭包使用相信大家都知道结果,内层函数f()访问到了外层函数checkscope()内的scope值为“local scope”的变量,最终返回执行后的scope值。

闭包真好用,避免变量全局污染,对于闭包内未使用的变量要及时清除,垃圾回收机制GC不会对闭包内的变量进行回收, 滥用闭包会造成内存溢出,非常消耗性能的,这可是大忌。

NO.2

78d15dbe208a05601e5a68cf03286764.png

会输出什么呢? 咦~ 貌似和上面的题一样,结果还是会输出"local scope" 和上一题不同之处在于第一题返回执行后的结果,而这题返回一个未执行的函数,这个函数在checkscope函数外部调用的。

NO.3

05cd6cc807d0ec168276b7d057f2e61f.png

执行结果会是什么呢?

答案:

undefined

1

undefined

undefined

执行fn(),第一个会输出全局变量的1吗?no,使用var定义的变量存在变量提升,在函数体内变量a未定义就使用首先会输出 undefined,接下来代码走到this.a,这时this指向全局的window,也就是 this.a 等价于 window.a , 此时会打印1。

执行new fn(),fn函数被实例化,构造函数fn在创建时确定this指向,此时this会指向fn,第一个输出的变量a未声明就使用还是会输出 undefined,当代码执行到this.a ,fn.a找不到所以输出undefined。

NO.4

72f3189c33201c5a328e1f7fcc8edd42.png

这道题很简单,相信大家都能答对,希望大家也能知道是什么原因?

在函数传参的时候传递的是对象在堆中的内存地址值,fn函数中的实参obj是obj对象的内存地址,通过调用obj.a= 2就改变了它在堆内存中的值。

对上一题做一个扩展,直接上代码

02ff7d83bc70cdbc758d70ce115e0a9d.png

答案:

p1:{name: “lisi”, age: 21}
p2:{name: “zhangsan”, age: 12}

fn函数中的实参person是p1对象的内存地址,通过调用person.age = 21改变了p1的值,但随后person变成了另一块内存空间的地址,并且在最后将另外一份内存空间的地址返回,赋给了p2,所以p2是一个新返回的对象。

看完上面的题感觉怎么样?自己是否答对了,前端知识体系是一个积累、沉淀和不断学习的过程,希望每一位前端工程师能做到知其然,知其所以然,路漫漫其修远兮,大家加油吧!~

---作者:Eiji

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值