前端问题集锦

1、原始类型有哪几种?null 是对象嘛?

__proto__

Boolean String Number Undefined Null Symbol(ES6新增) ES10新增了一种基本数据类型:BigInt。

复杂数据类型只有一种: Object 
null为空对象

2、对象类型和原始类型的不同之处?函数参数是对象会发生什么问题?

简单类型存放栈中,引用类型存放堆中,栈中变量存放引用地址

函数传参都是按值传递(栈中的存储的内容):基本数据类型,拷贝的是值;复杂数据类型,拷贝的是引用地址

内存的分配不同、访问机制不同、复制变量时不同(a=b)

3、typeof 是否能正确判断类型?instanceof 能正确判断对象的原理是什么?

typeof ⼀一元运算,后接任意类型 返 回"number""string""boolean""object""function" "undefined”。 

用来检测一个对象是否已经定义或者是否已经赋值。判断原始类型可以 复杂类型不不准确,⽐如null ‘object’。instanceof来检测某个对象是不不是另⼀一个对象的实例例,object instanceofconstructor

但是拿来判断复杂类型也不不准确,

如 :var a=new Array();

alert(a instanceof Array); // true,

同时 alert(a instanceof Object) //也会返回 true;

这是因为 Array 是 object 的⼦子类。 

加上对象的prototype会改变 所以instanceof也会变化。 要准确判断复杂类型的具体哪种内置类型,得⽤Object.prototype.toString 

var a = new Date()

Object.prototype.toString.call(a)//"[object Date]"

4、如何进行类型转化,a) 对象转原始类型; b) 原始类型转对象;c)原始类型如何相互转换

参考链接:https://learnku.com/articles/7394/conversion-of-objects-to-basic-type-values-in-javascript

ToPrimitive(转换为原始值)

/**

* @obj 需要转换的对象

* @type 期望转换为的原始数据类型,可选

*/

ToPrimitive(obj,type)

Type为如下:

string: toString=> valueOf=>TypeError

Number: valueOf=> toString=>TypeError

空值:1.该对象为Date,则type被设置为String。2.否则,type被设置为Number

以下是es6引入symbol后,自定义对象转换基础类型的方法


来源MDN

toNumber Number()

toString

valueOf

ToObject=>原始类型变成对应内置对象,引用类型不变=>对象的 valueOf

5、==与===到底有什么差异,工作原理是什么;

"==="叫做严格运算符,"=="叫做相等运算符。

来源知乎


字符串比较按照字典顺序比较各个字符的unicode码点。

'cat' > 'Cat' // true'

'大' > '小' // false

原始类型的值之间,除了相等运算符(==)和严格相等运算符(===),其他比较运算符都是先转成数值再比较。

这里有一个特殊情况,即任何值(包括NaN本身)与NaN比较,返回的都是false.

对象是先转换成原始类型,valueOf()后还是对象再调用toString()。Date对象是先调用toString()后调用valueOf()

var x = [2];

x > '11' // true

// 等同于 [2].valueOf().toString() > '11'

// 即 '2' > '11'

严格相等运算符===:值和类型都相等

1 === 0x1 // true

+0 === -0 // true

复合类型===比较的是指针是否指向同一个地址,大小运算符比较的是值。

null===null  //true

undefined===undefined  //true

NaN===NaN //false

相等运算符:先将数据进行类型转换,然后再用严格相等运算符比较。

原始类型:原始类型的数据会转换成数值类型再进行比较.

'1' == true  // true

// 等同于 Number('1') === Number(true)

// 等同于 1 === 1

对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较.

[1] == '1' // true // 等同于 Number([1]) == Number('1')

undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。只有在对象转为原始值得到undefined时,才会返回true

6、为什么 0.1 + 0.2 != 0.3?如何解决这个问题?

参考链接:https://juejin.im/post/5b20cbb051882513ac20354f#heading-1

0.1 + 0.2 === 0.30000000000000004 

Js是双精度存储占⽤用 64 bit,浮点数在转换为⼆二进制表示的时候,无法精 确表示这 种包含小数点的数据,在Math.pow(2, 53)之前精度不不会丢失 , 一般将⼩数变成整数再进⾏比较

7、new 的原理是什么?通过 new 的方式创建对象和通过字面量创建有什么区别?

New 的过程: 

1.创建空对象; var obj = {};

2. 完成原型链的构建 

将所创建对象的__proto__属性值设为构造函数的prototype的属性值,, 即 指向 构造函数的原型对象 

设置新对象的constructor属性为构造函数的名称,设置新对象的 __proto__ 属性 指向构造函数的prototype对象;

obj.__proto__ = Person.prototype; 

3.执⾏行行构造函数中的代码,构造函数中 的this指向new出对象 

4.返回对象,并赋给等号左边的变量量,如果函数没有返回其他对象,那么 

new表达式中的函数调⽤用会⾃自动返回这个新对象。 字⾯面量量创建对象,不 不会调⽤用 Object构造函数, 简洁且性能更更好;

new Object() ⽅方式创建对象本质上是⽅方法调⽤用,涉及到在proto链中遍历 该⽅方法,当 找到该⽅方法后,⼜又会⽣生产⽅方法调⽤用必须的 堆栈信息, ⽅方法调⽤用结束后,还要释放该 堆栈,性能不不如字⾯面量量的⽅方式。 通 过对象字⾯面量量定义对象时,不不会调⽤用Object构造函数。 

js中的内置对象:String、Number、Boolean、Object、Function、Array、Date、Error、RegExp

8、布尔值如何转化?转换原理是什么

Js中预期为布尔值的地方,自动调用Boolean函数,

以下为false ,其他为true:undefined、null、+0或-0、NaN、''(空字符串)

9、null和undefined的异同?

null是一个表示"无"的对象,"没有对象",即该处不应该有值,转为数值时为0;一般前端设置变量为null取消指向有值的对象,以释放内存。

undefined是一个表示"无"的原始值,"缺少值",就是此处应该有一个值,但是还没有定义,转为数值时为NaN

10、如何深入理解js对象


因此,情况是这样的,ECMAScript 规范说 prototype 应当是一个隐式引用:

1)通过 Object.getPrototypeOf(obj) 间接访问指定对象的 prototype 对象。

2)通过 Object.setPrototypeOf(obj, anotherObj) 间接设置指定对象的 prototype 对象。

3)部分浏览器提前开了 __proto__ 的口子,使得可以通过 obj.__proto__ 直接访问原型,通过 obj.__proto__ = anotherObj 直接设置原型。

4)ECMAScript 2015 规范只好向事实低头,将 __proto__ 属性纳入了规范的一部分。

访问对象的 obj.__proto__ 属性,默认走的是 Object.prototype 对象上 __proto__ 属性的 get/set 方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,093评论 0 3
  • 第一章 错误处理: 错误: 程序运行过程中,导致程序无法正常执行的现象(即bug) 现象: 程序一旦出错,默认会报...
    fastwe阅读 1,091评论 0 1
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,521评论 0 5
  • JavaScript面向对象程序设计 本文会碰到的知识点:原型、原型链、函数对象、普通对象、继承 读完本文,可以学...
    moyi_gg阅读 757评论 0 2
  • 古天乐今年很多产,确切说他一直很多产……这部《犯罪现场》,宣传主打古天乐宣萱《寻秦记》多年后再度合体出演,个人感觉...
    不见长安1943阅读 823评论 0 0