关于Web面试的基础知识点(一)
文章目录
前言
此博客用来记录刷题时遇到的易错点和重点内容
1.著名的“null==undefined"
undefined
undefined 的字面意思就是未定义的值,这个值的语义是,希望表示一个变量最原始的状态,而非人为操作的结果 。 这种原始状态会在以下 4 种场景中出现:
- 声明一个变量,但没有进行赋值
- 访问对象上不存在的属性
- 函数定义了形参,但未传递实参
- 使用void进行表达式求值
null
null 的字面意思是 空值 ,这个值的语义是,希望表示 一个对象被人为的重置为空对象,而非一个变量最原始的状态 。
一般有两种使用场景:
- 作为函数的参数,表示该函数的参数不是对象。
- 作为对象原型链的终点。
注意: null 有属于自己的类型 Null,而不属于Object类型。
typeof 之所以会判定为 Object 类型,是因为JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,因此,null 被误判断为 Object 类型。
null == undefined ???
虽然 undefined 和 null 的语义和场景不同,但总而言之,它们都表示的是一个无效的值。 因此,在JS中对这类值访问属性时,都会得到异常的结果。ECMAScript 规范认为,既然 null 和 undefined 的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也具有相似性,即有
但是:
Number(null); // 0
Number(undefined); // NaN
//在比较相等性之前,null 没有被转换为其他类型
null == 0 ; //false
2.假值
在JavaScript中,false、null、0、" "、undefined 和 NaN被称为假值。
var x = new Boolean();.
1.如果Boolean构造函数的参数不是一个布尔值,则该参数会被转换成一个布尔值。
2.如果参数是 0, -0, null, false, NaN, undefined, 或者空字符串 (“”),生成的Boolean对象的值为false。
3.其他任何值,包括任何对象或者字符串”false”, 都会创建一个值为true的Boolean对象。
var value = Boolean(value);
非布尔值转化成布尔值,需要直接使用Boolean函数,而不能通过新建Boolean对象。
3.Javascript的数据类型
基本类型:String Null Undefined Number Boolean
复杂类型:Object Array Date Regexp Function
基本包装类型:Boolean Number String
单体内置对象:Global Math
4.求(99<0 || ‘false’)运行结果的类型
按照一些语言的标准,进行与或逻辑运算之后,返回值只有false和true,所以返回值的数据类型就应该是Boolean。
对于Javascript来说:
与运算:一假则假(false),全真为真(true)
或运算:全真必为真(true),前者假直接返回后者(不论后者是什么数据,原样输出)
所以说,答案就是
typeof "false" //String
5.setTimeout()
setTimeout()是Window对象上的一个方法。setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。
var myVar;
function myFunction() {
myVar = setTimeout(alertFunc, 3000);
}
function alertFunc() {
console.log("Hello!");
}
myFunction() //调用函数
var myVar;
function myFunction() {
myVar = setTimeout(alertFunc(), 3000);
}
function alertFunc() {
console.log("Hello!");
}
myFunction() //调用函数
从上面两段代码可以看见其中的不同是:setTimeout()函数内部参数。一个传递的是要调用的函数名,而另外一个函数传递的是一个函数。
运行结果的不同
第一段代码:
第二段代码:
当传递的参数是函数名的时候,会在设置的时间之后进行输出。如果以函数进行传参,会直接执行所传递的函数,而无视所设置的毫秒数。
注意:当传递的参数用引号进行包裹:
使用引号传递函数和直接传递函数名的结果是一致的。用引号传递函数名,那就是一个字符串了,毫无输出。
6.变量提升
var a=10
function test(){
console.log(a)
var a = 100
console.log(a)
}
test()
个人理解错误之处:执行test函数,第一次调用a进行输出,但是并未进行a的赋值,在全局找a,a=10,输出10。最终输出:10 100
注意:在变量提升中,(以上面的例子为例)如果在调用a之前并未找到,在全局函数寻找并进行调用。但是有个前提: 局部函数中没有再次定义a的值。
Note:当局部函数中有相同的值,不会找全局参数,在函数内进行变量提升。
最终输出:
7.Javascript中实现跨域的方式总结
第一种方式:jsonp请求
jsonp的原理是利用<script>
标签的跨域特性,可以不受限制地从其他域中加载资源,类似的标签还有<img>
.
第二种方式:document.domain
这种方式用在主域名相同子域名不同的跨域访问中
第三种方式:window.name
window的name
属性有个特征:在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name
的,每个页面对window.name
都有读写的权限,window.name
是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。
第四种方式:window.postMessage
window.postMessages
是html5中实现跨域访问的一种新方式,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源。
第五种方式:CORS
CORS背后的基本思想,就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是应该失败。
第六种方式:Web Sockets
web sockets原理:在JS创建了web socket之后,会有一个HTTP请求发送到浏览器以发起连接。取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为web sockt协议。
8.JavaScript中实现异步编程模式的方法
- 回调函数
这是异步编程最基本的方法,优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱,而且每个任务只能指定一个回调函数。
例:假定有两个函数f1和f2,后者等待前者的执行结果,如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调函数。
- 事件监听
任务的执行不取决于代码的顺序,而取决于某个事件是否发生。优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以”去耦合”(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。
例:为f1绑定一个事件,当f1发生done事件,就执行f2。
- 发布/订阅
我们假定,存在一个”信号中心”,某个任务执行完成,就向信号中心”发布”(publish)一个信号,其他任务可以向信号中心”订阅”(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做”发布/订阅模式”(publish-subscribe pattern), 又称”观察者模式”(observer pattern)。
这种方法的性质与”事件监听”类似,但是明显优于后者。因为我们可以通过查看”消息中心”,了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。
- Promises对象
Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。简单说,它的思想是,每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。回调函数变成了链式写法,程序的流程可以看得很清楚,而且有一整套的配套方法,可以实现许多强大的功能。
9.解释性语言和编译性语言
解释性语言和编译性语言的定义:
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。
翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。
解释性语言的定义:
解释性语言的程序不需要编译,在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就需要逐行翻译一次,效率比较低。
现代解释性语言通常把源程序编译成中间代码,然后用解释器把中间代码一条条翻译成目标机器代码,一条条执行。
常见的解释性语言: Python、JavaScript、PHP、Shell、MATLAB
编译性语言的定义:
编译性语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。
常见的编译型语言:C/C++、Pascal/Object Pascal(Delphi)
图片原地址
10.Javascript全局
js的全局属性: Infinity、NAN、undefined
js的全局函数:
decodeURI()、decodeURIcomponent()、 encodeURI、encodeURIcomponent()、 scape()、eval()、isFinite()、isNAN()、 Number()、parseFloat()、parseInt()、String()、unescape()。