1.js的数据类型有哪些
- 基本类型:null,undfiend,boolean,number,string,symbol,bigin
- 引用类型:Object(包含Object,Array,Function)
2.ES6新增了哪些内容
let块级作用域声明方式、const声明常量、箭头函数、模版字符串、解构赋值、展开运算符、模块、class类、Set、Map、Promise
3.常用的运行算符
- 算术运算符:+ - * / % ++ -- **
- 比较运算符:== === != !== > < >= <=
- 逻辑运算符:&& || !
- 展开运算符
- 三元运算符
4.运算符的优先级(从高到低)
-
小括号
()
-
一元运算符
delete ++ -- !
-
算术运算符 先乘除
*
/ % 后加减
+
- -
移位运算符
<< >>
-
比较运算符 先大小
>
< >= <= 后相等 == !=
-
按位运算符
&
^
|
-
逻辑运算符
&& ||
-
三元运算符
-
赋值
= += -= *= /= %= &= |= ^= <<= >>= >>>=
5.说一下innerHTML 与 innerText的作用与区别?
- 作用:都可以获取或者设置元素的内容
- 区别:innerHTML可以解析内容中的html标签
- innerText不能解析内容中的html标签
6.JavaScript 由以下三部分组成:
- ECMAScript:是JavaScript的核心,描述了语言的基本语法和数据类型。它是一套标准,定义了一种语言的规范,规定了基本语法、数据类型、关键字等的设计规范,也是解析引擎设计的参考标准,但与具体实现无关。
- DOM(文档对象模型):是一套操作页面元素的API,可以把HTML看做是文档树,通过DOM提供的API可以对树上的节点进行操作,从而改变页面的内容和结构。
- BOM(浏览器对象模型):是一套操作浏览器功能的API,通过BOM可以操作浏览器窗口,比如弹出框、控制浏览器跳转、获取分辨率等,与浏览器交互的部分功能都是通过BOM来实现的。
7.介绍 JS 有哪些内置对象?
- 数据封装类对象:Object、Array、Boolean、Number、String
- 其他对象:Function、Arguments、Math、Date、RegExp、Error
- ES6 新增对象:Symbol、Map、Set、Promises、Proxy、Reflect
8.说几条写 JavaScript 书写的基本规范?
- 代码一定要正确缩进,建议使用"二个或者四个空格"缩进
- 语句结束使用分号;
- 规范定义 JSON 对象,补全双引号
- 用{}和[]声明对象和数组
- 变量和函数在使用前进行声明
- 以大写字母开头命名构造函数,全大写命名常量
- 代码段使用花括号{}包裹
- 还有要书写正确的标识标签
9.什么是标识符?
- 在JS中,可以自定义命名的东西都属性标识符;
- 比如变量名,函数名,参数名都是标识符
10.offsetWidth,clientWidth,scrollWidth的区别?
- offsetWidth返回值包含 content + padding + border + 包含滚动条;
- clientWidth返回值只包含 content + padding,不包含滚动条;
- scrollWidth返回值包含 content + padding + 溢出内容的尺寸;
11.解释什么是Json
- json是一种轻量级的数据交换格式,一般用于数据传递
- 里边只允许出现双引号
- JSON的语法表示三种类型值,简单值(字符串,数值,布尔值,null), 数组,对象
12.检测数据类型的方法有哪些
- typeof:基本类型检测;
- instanceof:判断a是否是b的实例;
- Object.prototype.toString.call() :使用call把Object对象的toString方法指向value,获取value的原生构造函数名;
- constructor:属性可能会被改写,导致检测结果不准确;
13.为什么typeof检测null等于object
null 其实属于自己的类型 Null,而不属于Object类型。因为JavaScript 数据类型在底层是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,null 的二进制位恰好都是 0 ,因此,null 被误判断为 Object 类型。 属于javascript历史遗留问题。
14.为什么typeof检测Array等于object
在JavaScript里 array 的原型是object.prototype,所以array会显示object
15.为什么typeof检测函数不等于object
如果一个对象实现了[[call]]方法就是function,否则为object。
16.null和undfiend的区别
- null。表示一个空的对象指针,通常用于表示一个变量不包含任何对象。在JavaScript中,null被视为一个空值或缺少值的对象指针,它是一个被明确赋予的值,用来表示没有有效的对象引用。转化为数值是0
- undefined。表示一个未初始化(未定义)的值,通常用于表示尚未赋值的变量。在JavaScript中,undefined是一个全局变量,在没有被赋值的情况下,默认的初始值就是undefined。当你尝试使用一个未初始化的变量时,JavaScript引擎会返回undefined。转化为数值是NAN。
17.其他类型转化成数值
- null 转换之后是 0
- undefined 转换之后是 NaN
- Object 转换之后是 NaN
- String
- 如果字符串中都是数值, 那么就可以正常转换
- 如果字符串是一个空串
""
/" "
, 那么转换之后就是0
- 如果字符串中不仅仅是数字, 那么转换之后是
NaN
- Boolean
true
转换之后是1
false
转换之后是0
- Array
- 空数组,当将其转换成number时,得到的结果为0;
- 只有一个数字成员的数组,得到的结果是该数字;
- 多个数字成员的数组,得到的结果为NaN;
18.介绍一下symbol?怎么迭代symbol描述的键?
- symbol是js为了解决命名冲突而引入的一种ES6新的基本数据类型,表示独一无表示独一无二的值。
- 独一无二性:每个 Symbol 值都是唯一的,无法通过简单的值比较相等。
- 不可变性:Symbol 值一旦创建,就不能被修改。
- 隐藏性:使用 Symbol 作为属性键,这些属性对于常规的对象遍历和操作是不可见的。
- 作为属性键:Symbol 可以作为对象的属性键,用于创建对象的私有属性或隐藏属性,以避免命名冲突。
- symbol常用的的方法
- Symbol.for() 全局符号注册表
- Symbol.keyFor() 查询全局注册表
- Object.getOwnPropertySymbols() 获取对象内部symbol命名的key
- Reflect.ownKeys() 获取对象内部所有的key
19.介绍一下bigint?为什么会出现bigint
- bigint是js为了解决数值过大导致的精度失真问题而引入的一种ES6新的基本数据类型,表示表示任意长度的整数。
- bigint不能直接和普通数据类型进行运算,必须保证参与运算的值都是bigint类型
- 创建bigint的方式有两种
- 在一个整数字面量后面添加一个字母
n
,如9007199254740991n
- 使用
BigInt()
函数将普通整数值转换为BigInt类型,如BigInt(9007199254740991)
- 在一个整数字面量后面添加一个字母
20.var、let、const的作用
- var :变量声明方式,声明的变量具有变量提升,一般情况下会提升到全局,但是在函数内部会形成局部变量。支持重复声明,支持修改。
- let:块级作用域声明方式,不具备变量提升。不支持重复声明,支持修改。
- const:常量声明方式,不具备变量提升。不支持重复声明,不支持修改。
21.const声明的引用类型数据可以修改吗
因为const只能浅层检测引用类型数据指针(地址),所以不能直接修改引用类型数据的指针(地址),但是可以修改引用类型数据内部的元素。
22.Math常用的方法
- min、max、abs绝对值、PI、pow幂、sqrt平方根、sell向上取整、floor向下取整、trunc保留整数位、round四舍五入、random随机数
23.数值常用的方法
- toFixed(digits):将数字转换为指定小数位数的字符串。
- toPrecision(precision):将数字转换为指定有效位数的字符串。
- isNaN(value):检查一个值是否为 NaN(非数字)
- isFinite(value):检查一个值是否是有限数。
- parseInt(string, radix):将字符串解析为整数。
- parseFloat(string):将字符串解析为浮点数。
- Number()将其他类型数据转化成数值
24.字符串常用的方法
- 不改变原字符串:trim、toLowerCase、toUpperCase、chartAt、includes、indexOf、lastIndexOf、search、match、startsWith、endsWith、silce、substr、substring、replace、replaceAll、concat、repeat、split。
25.函数常用的方法
- call、apply、bind
25.对象常用的方法
- 不改变原对象:Object.keys、Object.values、Object.entries、Object.isFrozen、obj.hasOwnProperty、key in obj
- 改变原对象:Ovject.create、Object.assign、Object.freeze、Object.defineProperty、Object.defineProperties
26.数组常用的方法
- 改变原数组:push、pop、unshift、shift、store、reverse、splice、fill;
- 不改变原数组:at、includes、indexOf、lastIndexOf、slice、concat、flat(Infinity)、toString、join、some、every、find、findindex、forEach、Map、flatMap、filter、reduce、reduceRight
27.伪数组
- 伪数组的特征
- 具有length属性;
- 按索引方式存储数据;
- 不具有数组的方法.
- 伪数组转数组的方法
- Array.from()
- Array.prototype.slice.call()
- 展开运算符(...)
- 常见的伪数组
- new Set()
- arguments
- document.getElementsByClassName('div')
28.循环语句
- while:while 语句只要指定条件为 true,就会执行循环
- 参数1:必须。定义执行循环的条件
- do/while:先执行一次代码块,再检查条件是否为真,为真就继续循环
- 参数1:必须。定义执行循环的条件
- for:可以指定代码块循环的次数
- 参数1:可选,初始化的变量,也可以指定多个;
- 参数2:可选,条件判断语句;
- 参数3:可选,每次循环后执行的语句;
- for/of:用于遍历数组
- 参数1:必须。数组的元素。
- 参数2:必须。指定遍历的数组。
- for in:用于迭代对象或者数组
- 参数1:必须。对象的键或数组的索引。
- 参数2:必须。指定迭代的的对象或者数组。
- forEach:遍历数组
- 参数1:对数组元素执行的回调函数
- 参数2:this指向
- forEach没有返回值
29.forEach、for中断循环、跳出循环?
- forEach:中断循环try/catch/throw;跳出当前循环return;
- for:中断循环break;跳出当前循环continue;
30.for of为什么不可以遍历对象
对象是不可迭代的。es6中引入了iterator接口,只有提供了iterator接口的数据类型才可以使用“for-of”来循环遍历;而普通对象默认没有提供iterator接口,因此无法用“for-of”来进行遍历。
31.字符串slice和substring的区别
- 都可以从字符串中指定起止位置提取并返回一个新的字符串,且不修改原数组。
- 两者第二个参数都可以省略(默认提取到字符串末尾)。
- slice如果参数是负数,则表示从字符串的尾部开始计数,。
- substring如果任一参数是负数,它会被视为0。
32.数组去重的方法有哪些
- Array.from(new Set())
- arr.filter((item, index) => arr.indexOf(item) === index);
- arr.reduce((total, item) => (total?.includes(item) ? total : [...total, item]) , []);
33.数组拍平的方法有哪些
- arr.flat(Infinity)
- arr.toString().split(',').map((item) => Number(item));
- arr.reduce((total, item) => (Array.isArray(item) ? [...total, ...flat(item)] : [...total, item]),[],);