JS 由哪几部分组成?
- ECMAScript:描述了该语言的语法和基本对象。
- 文档对象模型(DOM):描述处理网页内容的方法和接口。
- 浏览器对象模型(BOM):描述与浏览器进行交互的方法和接口。
JavaScript 的特点有哪些,写6个?
- 解释性脚本语言
- 基于对象
- 弱类型语言
- 事件驱动脚本语言
- 跨平台的脚本语言
- 单线程语言
列举Java和JavaScript之间的区别?
Java是一门十分完整、成熟的编程语言。相比之下,JavaScript是一个可以被引入HTML页面的编程语言。这两种语言并不完全相互依赖,而是针对不同的意图而设计的。 Java是一种面向对象编程(OOPS)或结构化编程语言,类似的如C ++或C,而JavaScript是客户端脚本语言,它被称为非结构化编程。
JS原始数据类型有哪些?引用数据类型有哪些?
我们知道 JavaScript 是一种弱类型的脚本语言。弱类型就指的是当我们定义变量时,并不需要指定变量的类型,程序在运行的时候会自动判断类型。
那具体有哪些数据类型呢?变量的类型主要分为两类:原始类型和对象类型。
7种原始类型
- Boolean:用于 true 和 false
- String:用于字符串:一个字符串可以包含一个或多个字符
- Number:用于任何类型的数字:双精度64位浮点,最多只能表示2^53 - 1 的整数
- BigInt(ES10 新定义):用于任意长度的整数
- Null:用于未知的值 —— 只有一个 null 值的独立类型
- Undefined:用于未定义的值 —— 只有一个 undefined 值的独立类型
- Symbol(ES6 新定义):用于唯一的标识符
原始类型都是值,所以也可以叫做值类型。
对象类型(Object)
除了原始类型,其他都是对象类型。对象类型也可以叫做引用类型。
对象类型包括:
- 普通对象-Object
- 数组对象-Array
- 函数对象-Function
- 正则对象-RegExp
- 日期对象-Date
- 数学函数-Math
有哪些方法判断变量的数据类型?
- typeof
- instanceof
- Object.prototype.toString.call()
- 查看 constructor 属性
new Object(null)输出什么?
{}
谈一谈你对深拷贝和浅拷贝的理解。
- 数据分为基本数据类型和引用数据类型。深拷贝和浅拷贝只是针对引用数据类型的操作。
- 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
- 深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
用Object.assign()拷贝对象的时候,什么时候是深拷贝,什么时候是浅拷贝?
- 如果属性值为简单类型(如string, number),得到的新对象为深拷贝。
- 如果属性值为对象或其它引用类型,得到的新对象为浅拷贝。
如何获取一个对象的所有属性名称?
Object.getOwnPropertyNames
值为 false 的 Boolean 对象有哪些?写五个
- new Boolean();
- new Boolean(0);
- new Boolean(null);
- new Boolean(‘’);
- new Boolean(false);
null
和 undefined
的区别?
- null表示没有对象,即该处不应该有值
- 作为函数的参数,表示该函数的参数不是对象
- 作为对象原型链的终点
- undefined表示缺少值,即此处应该有值,但没有定义
- 变量被声明了,但没有赋值时,就等于undefined
- 调用函数时,应该提供的参数没有提供,该参数等于undefined。
- 对象没有赋值的属性,该属性的值为undefined。
- 函数没有返回值时,默认返回undefined。
String()
和 toString()
的区别:
- toString()无法转换null和undefined
break
,continue
的区别是什么?
- break 退出整个循环
- continue 跳过本次循环
setTimeout
与 setInterval
有何区别?
- setTimeout:指定的毫秒数后调用函数或计算表达式
- setInterval:指定的周期(以毫秒计)来调用函数或计算表达式
setTimeout表示间隔一段时间之后执行一次调用,而setInterval是每隔一段时间循环调用,直至清除。
target
、currentTarget
的区别?
- currentTarget当前所绑定事件的元素
- target当前被点击的元素
documen.write
和 innerHTML
的区别?
- document.write 只能重绘整个页面
- innerHTML 可以重绘页面的一部分
静态作用域与动态作用域的区别是什么?
- 静态作用域:函数的作用域在函数定义的时候就决定了
- 动态作用域:函数的作用域是在函数调用的时候才决定的
encodeURI
与 encodeURIComponent
的区别?
- encodeURI()/decodeURI():对url编码,解码
- encodeURIComponent()/decodeURIComponent():对url编码、解码
- encodeURI 对url中常见的符号,以及网址中有特殊含义的符号不编码
- encodeURIComponent会对
"; / ? : @ & = + $ , #
编码:
const uri = 'https://baidu.com/?x=你好&y="1"#';
const encoded = encodeURI(uri);
// https://baidu.com/?x=%E4%BD%A0%E5%A5%BD&y=%221%22#
const encoded = encodeURIComponent(uri);
// https%3A%2F%2Fbaidu.com%2F%3Fx%3D%E4%BD%A0%E5%A5%BD%26y%3D%221%22%23
- encodeURI 编码后还是url,适用于携带参数域名跳转,前后端访问
- encodeURIComponent 编码后不再是url,适用于作为参数传递
注意:对单引号不编码,双引号编码
for ... of
、for...in
区别
for…of 用于遍历一个迭代器,如数组:
let letters = ['a', 'b', 'c'];
letters.size = 3;
for (let letter of letters) {
console.log(letter);
}
// 结果: a, b, c
for…in 用来遍历对象中的属性:
let stus = ["Sam", "22", "男"];
for (let stu in stus) {
console.log(stus[stu]);
}
// 结果: Sam, 22, 男
export
和 export default
的区别?
export与export default均可用于导出常量、函数、文件、模块等
- 在一个文件或模块中,export可以导出多个,对应的 import导入加{ }
// 导出
export function fn1(){ }
export function fn2(){ }
export function fn3(){ }
// 导入
import {fn1, fn2, fn3} from AAA
- export default仅可以导出一个,对应的import导入时候不用加花括号
箭头函数和普通函数的区别是什么?
普通函数this:
- this总是代表它的直接调用者。
- 在默认情况下,没找到直接调用者,this指的是window。
- 在严格模式下,没有直接调用者的函数中的this是undefined。
- 使用call,apply,bind绑定,this指的是绑定的对象。
箭头函数this:
- 在使用=>定义函数的时候,this的指向是 定义时所在的对象,而不是使用时所在的对象;
- 不能够用作构造函数,这就是说,不能够使用new命令,否则就会抛出一个错误;
- 不能够使用 arguments 对象;
- 不能使用 yield 命令;
如何中断ajax请求?
- 一种是设置超时时间让ajax自动断开
- 另一种是手动停止ajax请求,其核心是调用XML对象的abort方法,ajax.abort()
在地址栏输入一个url到页面加载完成的全过程
- 解析 HTML并构建DOM树
- 计算样式构建CSSOM 树
- 计算图层布局
- 绘制图层
- 整合图层,得到页面
什么是事件代理,有什么好处?
由于事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。
优点:减少内存消耗,提高性能
Promise对象有几种状态,分别表示什么?
- pending:等待中,或者进行中,表示还没有得到结果
- resolved(Fulfilled):已经完成,表示得到了我们想要的结果,可以继续往下执行
- rejected:也表示得到结果,但是由于结果并非我们所愿,因此拒绝执行
箭头函数有哪些特点?
- 不需要function关键字来创建函数
- 省略return关键字
- 改变this指向