四十二:js 事件委托
四十三:ajax 请求的时候 get 和 post 方式的区别?
1、get 一般用来进行查询操作,url 地址有长度限制,请求的参数都暴露在 url 地址当中, 如果传递中文参数,需要自己进行编码操作,
安全性较低。
2、post 请求方式主要用来提交数据,没有数据长度的限制,提交的数据内容存在于 http 请求体中,数据不会暴漏在 url 地址中。
四十四:解释 jsonp 的原理,以及为什么不是真正的 ajax
1、Jsonp 并不是一种数据格式,而 json 是一种数据格式,jsonp 是用来解决跨域获取数据 的一种解决方案,
具体是通过动态创建 script 标签,然后通过标签的 src 属性获取 js 文件 中的 js 脚本,该脚本的内容是一个函数调用,
参数就是服务器返回的数据,为了处理这些 返回的数据,需要事先在页面定义好回调函数,本质上使用的并不是 ajax 技术。
四十五:我们给一个 dom 同时绑定两个点击事件,一个用捕获,一个用冒泡,你来说 下会执行几次事件,然后会先执行冒泡还是捕获?
1、冒泡机制的执行顺序是自下往上的,当目标元素绑定的事件被触发时,事件会从目标元素自下向上依次执行。
2、捕获机制的执行顺序是自上往下的,当目标元素绑定的事件被触发时,事件会从 DOM 树最顶层自上向下依次执行,直到执行到目标元素为止。
四十六:想实现一个对页面元素的拖拽,请说说思路,以及用原生 JS 写一个相关案例
思路:
1. 给需要拖拽的节点绑定 mousedown, mousemove, mouseup 事件
2. mousedown 事件触发后,开始拖拽
3. mousemove 时,需要通过 event.clientX 和 clientY 获取拖拽位置,并实时更新位置
4. mouseup 时,拖拽结束
5. 需要注意浏览器边界的情况
实例代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
width: 100px;
height: 100px;
background-color: red;
position: absolute;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
<script>
var div_ = document.getElementsByTagName('div')[0];
div_.onmousedown = function (e) {
//获取当前的事件 window.event
e = e || window.event;
var offsetX_ = e.offsetX;
var offsetY_ = e.offsetY;
console.log(offsetX_, offsetY_);
document.onmousemove = function (e) {
e = e || window.event;
console.log(e.clientX)
div_.style.left = (e.clientX - offsetX_) + 'px';
div_.style.top = (e.clientY - offsetY_) + 'px';
}
}
div_.onmouseup = function () {
document.onmousemove = '';
// document.onmousemove = null;
}
</script>
四十七:javascript 代码中的"use strict";是什么意思 ? 使用时它区别是什么?
1、全局变量显式声明
2、静态绑定
3、禁止使用 with 语句
4、eval 中定义的变量都是局部变量
5、禁止 this 关键字指向全局对象
6、禁止在函数内部遍历调用栈
7、严格模式和正常模式下的对比:
1、严格模式下无法删除变量。只有 configurable 设置为 true 的对象属性,才能被删除
2、正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。
严格模式下, 将报错。
3、严格模式下,对一个使用 getter 方法读取的属性进行赋值,会报错。
4、严格模式下,对禁止扩展的对象添加新属性,会报错。
5、严格模式下,删除一个不可删除的属性,会报错。
6、正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下, 这属于语法错误。
7、正常模式下,如果函数有多个重名的参数,可以用 arguments[i]读取。严格模式下,这属于 语法错误。
8、正常模式下,整数的第一位如果是 0,表示这是八进制数,比如 0100 等于十进制的 64。严格模式禁止这种表示法,整数第一位为 0,将报错。 不允许对 arguments 赋值 arguments 不再追踪参数的变化禁止使用 arguments.call
9、严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的 代码块内声明函数
10、严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。
四十八:new 操作符具体干了什么呢?
1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
4、通过‘new’可以调用使用内置对象的方法。
四十九:documen.write 和 innerHTML 的区别?
1、document.write 是重写整个 document, 写入内容是字符串的 html
2、innerHTML 是 HTMLElement 的属性,是一个元素的内部 html 内容
五十:Object 对象的常用方法?
Object.hasOwnProperty( ) 检查属性是否被继承
Object.isPrototypeOf( ) 一个对象是否是另一个对象的原型
Object.propertyIsEnumerable( ) 是否可以通过 for/in 循环看到属性
Object.toLocaleString( ) 返回对象的本地字符串表示
Object.toString( ) 定义一个对象的字符串表示
Object.valueOf( ) 指定对象的原始值
五十一:JavaScript 中的作用域与变量声明提升?
理解 JavaScript 的预解析机制。
js 的运行主要分两个阶段:
js 的预解析和运行,预解析阶段所有的变量声明和函数定义都会提前,但是变量的赋值不会提前
五十二:请说一下箭头函数和普通的函数区别?
1、首先是写法不一样
2、箭头函数是匿名函数,不能称为构造函数。
在这个基础面试官再问:箭头函数为什么不能作为构造函数?或者说为什么箭头函数不能 new?
答:因为箭头函数的 this 指向父级,而普通函数的 this 如果在全局,指的就是 window ,如果在局部作用域则指向当前的对象。
3、普通函数可以通过class 来创造构造函数,核心还是与构造函数的写法的类似。
4、为什么箭头函数里面没有super,因为super 必须要写在构造函数里面,箭头函数不是个构造函数,所有super必须写在箭头函数中。