面试javascript上
weixin_50464014
这个作者很懒,什么都没留下…
展开
-
三 1 new操作符的实现原理
首先创建一个新的空对象让对象的原型__proto__=构造函数的prototype属性让函数的this指向这个对象,执行构造函数中的代码判断函数返回值的类型。如果是值类型,返回新创建的对象;如果是引用类型,返回这个引用类型的对象function objectFactory(){ //创建一个空对象 let newObject = null; //拿到那个构造函数 let constructor = Array.prototype.shift.call(arguments) if(typ.原创 2021-10-16 19:47:48 · 203 阅读 · 1 评论 -
四 原型和原型链
四 原型和原型链 在js中是使用构造函数来新建对象的,每个构造函数内部都有一个prototype属性,它的属性值是一个对象,包含了该构造函数的所有实例共享的属性和方法。当使用构造函数新建一个对象后,这个对象的原型__proto__指向构造函数的prototype属性对应的值,一般用Object.getPrototypeOf()方法获取对象的原型 当访问一个对象的属性时,如果这个对象内部不存在这个属性,就会去它的原型对象中找这个属性,这个原型对象又会有自己的原型,这样一直找下去,就是原型链。原型链的尽头一原创 2021-10-15 21:51:01 · 207 阅读 · 0 评论 -
ajax和axios的区别
$.ajax({ type:'get'//或者'post', url:接口地址, dataType:'json', data:{ 'username':'张三', 'password':'123456' }, success:function(response){ console.log(response)//获取返回的结果 }})axios({ url:接口地址, type:'po.原创 2021-10-15 20:04:53 · 165 阅读 · 0 评论 -
AJAX手写函数以及调用
//ajax调用$.ajax({ type:'get', url:'/getUsers', datatype:'json',//默认 data:{ 'a':1, 'b':2 }, success:function(response){ console.log(response); }})//ajax函数function ajax(json){ //浏览器的判断 if(window.XMLHttpRequest) var ajax=new XMLHttpRequest原创 2021-10-15 19:42:11 · 116 阅读 · 0 评论 -
三 25 for...in和for...of的区别
for…of 是ES6新增的遍历方式,允许遍历一个含有iterator接口的数据结构(数组、对象等)并且返回各项的值,和ES3中的for…in的区别如下:for…of 遍历获取的是对象的键值,for…in 获取的是对象的键名 for… in 会遍历对象的整个原型链,性能非常差不推荐使用,而 for … of 只遍历当前对象不会遍历原型链; 对于数组的遍历,for…in 会返回数组中所有可枚举的属性(包括原型链上可枚举的属性),for…of 只返回数组的下标对应的属性值;for...in 循.原创 2021-10-15 17:27:34 · 137 阅读 · 0 评论 -
三 18 尾调用
es6 javascript 尾调用_现在学习也不晚-CSDN博客_js 尾调用这篇文章写的实在太好了尾调用指的是函数的最后一步调用另一个函数。代码执行是基于执行栈的,所以当在一个函数里调用另一个函数时,会保留当前的执行上下文,然后再新建另外一个执行上下文加入栈中。使用尾调用的话,因为已经是函数的最后一步,所以这时可以不必再保留当前的执行上下文,从而节省了内存,这就是尾调用优化。但是 ES6 的尾调用优化只在严格模式下开启,正常模式是无效的。函数调用会在内存形成一个 “ 调用记录 ” ,又原创 2021-10-15 11:29:32 · 43 阅读 · 0 评论 -
实现一个AJAX请求
AJAX是Asynchronous JavaScript and XML的缩写,指的是通过Javascript的异步通信,从服务器获取XML文档从中提取数据,再更新当前页面的对应部分,而不用刷新整个网页创建AJAX请求的步骤:创建一个XMLHttpRequest对象在这个对象上使用open方法创建一个HTTP请求,open方法所需要的参数是请求的方法,请求的地址,是否异步和用户的认证信息在发起请求前,可以为这个对象添加一些信息和监听函数。一个 XMLHttpRequest对象一共有5个状态,当它原创 2021-10-15 11:08:46 · 306 阅读 · 0 评论 -
三 11 7 原码 反码 补码
原码就是一个数的二进制数。例如:10的原码为0000 1010-10的原码为1000 1010反码正数的反码和原码相同负数的反码为除符号位,按位取反,即0变1,1变0-10的原码:10001010-10的反码:11110101补码正数的补码和原码相同负数的补码是反码+1-10的原码:1000 1010-10的反码:1111 0101-10的补码:1111 0110取反运算符当发现按位取反为负数时,就直接取其补码如~6:0000 ..原创 2021-10-15 09:19:57 · 263 阅读 · 0 评论 -
三 6 对json理解 延迟加载 类数组
json是一种基于文本的轻量级的数据交换格式,在项目开发中,使用json作为前后端数据交换的方式在前端通过将一个符合 JSON 格式的数据结构序列化为 JSON 字符串,然后将它传递到后端,后端通过 JSON 格式的字符串解析后生成对应的数据结构,以此来实现前后端数据的一个传递。JSON 和 js 中的对象不是一回事,JSON 中对象格式更加严格,比如说在 JSON 中属性值不能为函数,不能出现 NaN 这样的属性值等,因此大多数的 js 对象是不符合 JSON 对象的格式的。在 js 中提供.原创 2021-10-15 08:59:39 · 149 阅读 · 0 评论 -
三 4 js的内置对象
js的内置对象指的是在程序运行之前,在全局作用域里由js定义的一些全局值属性、函数、构造函数对象。一般经常用到的如全局变量值NaN、undefined,函数如parseInt()、parseFloat,以及用来实例化对象的构造函数如Date、Object等等,还有提供数学计算的单体内置对象如 Math 对象。js 中的内置对象主要指的是在程序执行前存在全局作用域里的由 js 定义的一些全局值属性、函数和用来实例化其他对象的构造函数对象。一般经常用到的如全局变量值 NaN、undefined,全局函数如.原创 2021-10-14 15:00:59 · 62 阅读 · 0 评论 -
三 2 map object weakMap
Map Object 意外的键 Map默认情况下不包含任何键,只包含显式插入的键 Object有一个原型,原型链上的键名有可能和自己在对象上设置的键名冲突 键的类型 Map的键可以是任意值 Object的键必须是String或Symbol 键的顺序 Map中的key是有序的,迭代的时候,Map对象以插入的顺序返回key Object的键无序 迭代 Map 是 iterable 的,所以可以直接被迭代 迭代Object需要以某种方式...原创 2021-10-14 12:55:30 · 52 阅读 · 0 评论 -
二 11 ES6新特性 模板语法
var name = 'css' var career = 'coder' var hobby = ['coding', 'writing']var finalString = `my name is ${name}, I work as a ${career} I love ${hobby[0]} and ${hobby[1]}`可以用${}直接嵌入变量,还有两个特别好的优势:①在模板字符串中,空格、缩进、换行都会被保留②可以在${}里完成一些运算存在性判断inc..原创 2021-10-14 11:07:42 · 124 阅读 · 0 评论 -
二 8 解构
数组的解构const [a, b, c] = [1, 2, 3]a//1b//2c//3const [a,,c]=[1,2,3]a//1c//3对象的解构以属性名称为匹配条件const a={ name:'jennie' age:18}const {age,name}=a;age//18neme//jennie提取高度嵌套对象里的属性可以在解构出来的变量名右侧,通过冒号+{目标属性名}这种形式,进一步解构它,一直解构到拿到目标数据...原创 2021-10-14 10:58:00 · 45 阅读 · 0 评论 -
第2章 6 扩展运算符
1 对象扩展运算符对象扩展运算符用于取出参数对象中的所有可遍历属性,拷贝到当前对象中let bar={a:1,b:2}let baz={...bar}//{a:1,b:2}如果用户自定义的属性,放在扩展运算符的后面,则扩展运算符内部的同名属性会被覆盖掉let bar={a:1,b:2}let baz={...bar,...{a:3,b:4}}//{a:3,b:4}let bay={...bar,a:3,b:4}//{a:3,b:4}利用上述特性就可以很方便的修改对象..原创 2021-10-13 23:20:35 · 73 阅读 · 0 评论 -
二、1 let const var
let和const都是ES6新加的区别 var let const 是否存在变量提升 是 否 否 是否有块级作用域 否 是 是 是否添加全局属性 是 否 否 是否存在暂时性死区 否 是 是 能否重复声明 能 否 否 是否必须设置初始值 否 否 是 能否改变指针指向 能 能 否 const:基本数据类型:值不可改引用数.原创 2021-10-13 20:24:35 · 81 阅读 · 0 评论 -
21 Object.assign和扩展运算符
Object.assign()let outObj={ inObj:{a:1,b:2}}let newObj=Object.assign({},outObj)newObj.inObj.a=2console.log(outObj.inObj.a)//2说明Object.assign()是浅拷贝扩展运算符let outObj={ inObj:{a:1,b:2}}let newObj={...outObj}newObj.inObj.a=2console.log.原创 2021-10-13 16:47:28 · 622 阅读 · 0 评论 -
18 Javascript如何进行隐式类型转换
JavaScript 中的隐式类型转换主要发生在+、-、*、/以及==、>、<这些运算符之间。而这些运算符只能操作基本类型值,所以在进行这些运算前的第一步就是将两边的值用ToPrimitive转换成基本类型,再进行操作。ToPrimitive方法是js中每个值隐含自带的方法,用来将值(无论是基本类型还是对象)转换为基本类型值。如果值为基本类型,直接返回值本身;如果值为对象,ToPrimitive(obj,type)如果对象是Date对象,type默认为string其他一...原创 2021-10-13 16:28:03 · 119 阅读 · 0 评论 -
16 Object.is() == ===区别
==:若两边类型不一样,进行强制类型转换后再比较===:若两边类型不一样,直接falseObject.is():和===差不多,处理了一些特殊情况,两个NaN相等了,+0和-0不相等javascript的包装类在 JavaScript 中,基本类型是没有属性和方法的,但是为了便于操作基本类型的值,在调用基本类型的属性或方法时 JavaScript 会在后台隐式地将基本类型的值转换为对象,如const a = "abc";a.length; // 3a.toUpperCase(..原创 2021-10-13 15:45:49 · 38 阅读 · 0 评论 -
13 其他值转数字、string
其他值转数字Undefined -> NaNNull -> 0Boolean true->1 false-> 0String 调用Number()函数进行转换,若包含非数字值返回NaN,空字符串返回0Symbol 类型的值不能转换为数字,会报错。对象(包括数组)会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则将其强制转换为数字。为了将值转换为相应的基本类型值,抽象操作 ToPrimitive 会首先(通过内部操...原创 2021-10-13 13:38:04 · 133 阅读 · 0 评论 -
11 操作符==的强制类型转换规则
1.判断两者类型是否相同,若相同直接比较大小2.类型不同的话,进行类型转换3.若一个是null,一个是undefined,返回true4.若一个是string,一个是number,把string转换成number1 == '1' ↓1 == 15.若一个是boolean,把boolean转换成0或1'1' == true...原创 2021-10-13 13:20:04 · 395 阅读 · 0 评论 -
9 typeof NaN
NaN是指 “执行数学运算不成功,这是失败后返回的结果”NaN 指 “not a number”,它是一个警戒值,有特殊用途的常规量typeof NaN //number注意:NaN 和自身不相等NaN !== NaN ---------------trueisNaN:判断传入的值是否为NaN,它接收参数后会尝试将这个参数转换为数值,任何不能被转换为数值的值都会返回true,也就是说它判断的NaN更宽泛Number.isNaN:首先判断是不是数字,再判断是否为Na...原创 2021-10-13 13:11:11 · 130 阅读 · 0 评论 -
7 0.1+0.2 != 0.3
0.1的二进制表示为0.000110011001100... 1100循环0.2的二进制表示为0.00110011001100... 1100循环js存储二进制小数一共有64位,第一位表示正负,0为正,1为负接下来11为表示指数最后52位表示小数所以0.1和0.2最多保留有效数字为52+1=53位加起来的0.3转换成十进制就是0.30000000000000004解决的方法:设置一个误差范围,成为“机器精度” ,在ES...原创 2021-10-13 13:01:04 · 40 阅读 · 0 评论 -
6 instanceof 操作符的实现原理
instanceof 操作符用来判断该对象的原型链中是否含有构造函数的prototype属性,或者说该对象的原型链中是否含有该类型的原型function myInstanceof(left,right){ //获取对象的原型 let proto=Object.getPrototypeOf(left) //获取类型的原型,即构造函数的prototype属性 let prototype=right.prototype while(true){ if(原创 2021-10-13 12:42:42 · 53 阅读 · 0 评论