欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于Web面试的基础知识点(一)

程序员文章站 2022-03-14 22:52:33
...

前言

此博客用来记录刷题时遇到的易错点和重点内容

1.著名的“null==undefined"

undefined

undefined 的字面意思就是未定义的值,这个值的语义是,希望表示一个变量最原始的状态,而非人为操作的结果 。 这种原始状态会在以下 4 种场景中出现:

  1. 声明一个变量,但没有进行赋值
    关于Web面试的基础知识点(一)
  2. 访问对象上不存在的属性
    关于Web面试的基础知识点(一)
  3. 函数定义了形参,但未传递实参
    关于Web面试的基础知识点(一)
  4. 使用void进行表达式求值
    关于Web面试的基础知识点(一)

null

null 的字面意思是 空值 ,这个值的语义是,希望表示 一个对象被人为的重置为空对象,而非一个变量最原始的状态 。
一般有两种使用场景:

  1. 作为函数的参数,表示该函数的参数不是对象。
  2. 作为对象原型链的终点。
    关于Web面试的基础知识点(一)
    注意: null 有属于自己的类型 Null,而不属于Object类型。
    关于Web面试的基础知识点(一)
    typeof 之所以会判定为 Object 类型,是因为JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,因此,null 被误判断为 Object 类型。

null == undefined ???

虽然 undefined 和 null 的语义和场景不同,但总而言之,它们都表示的是一个无效的值。 因此,在JS中对这类值访问属性时,都会得到异常的结果。ECMAScript 规范认为,既然 null 和 undefined 的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也具有相似性,即有
关于Web面试的基础知识点(一)
但是:

Number(null); // 0
Number(undefined); // NaN
 
//在比较相等性之前,null 没有被转换为其他类型
null == 0 ; //false

2.假值

在JavaScript中,falsenull0" "undefinedNaN被称为假值。

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对象。
关于Web面试的基础知识点(一)

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),前者假直接返回后者(不论后者是什么数据,原样输出)
关于Web面试的基础知识点(一)
所以说,答案就是

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()函数内部参数。一个传递的是要调用的函数名,而另外一个函数传递的是一个函数。
运行结果的不同
第一段代码:
关于Web面试的基础知识点(一)
第二段代码:
关于Web面试的基础知识点(一)
当传递的参数是函数名的时候,会在设置的时间之后进行输出。如果以函数进行传参,会直接执行所传递的函数,而无视所设置的毫秒数。
注意:当传递的参数用引号进行包裹:
关于Web面试的基础知识点(一)
使用引号传递函数和直接传递函数名的结果是一致的。用引号传递函数名,那就是一个字符串了,毫无输出。

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:当局部函数中有相同的值,不会找全局参数,在函数内进行变量提升。
最终输出:
关于Web面试的基础知识点(一)

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中实现异步编程模式的方法

  1. 回调函数

这是异步编程最基本的方法,优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱,而且每个任务只能指定一个回调函数。

例:假定有两个函数f1和f2,后者等待前者的执行结果,如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调函数。

  1. 事件监听

任务的执行不取决于代码的顺序,而取决于某个事件是否发生。优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以”去耦合”(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。

例:为f1绑定一个事件,当f1发生done事件,就执行f2。

  1. 发布/订阅

我们假定,存在一个”信号中心”,某个任务执行完成,就向信号中心”发布”(publish)一个信号,其他任务可以向信号中心”订阅”(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做”发布/订阅模式”(publish-subscribe pattern), 又称”观察者模式”(observer pattern)。

这种方法的性质与”事件监听”类似,但是明显优于后者。因为我们可以通过查看”消息中心”,了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。

  1. Promises对象

Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。简单说,它的思想是,每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。回调函数变成了链式写法,程序的流程可以看得很清楚,而且有一整套的配套方法,可以实现许多强大的功能。

9.解释性语言和编译性语言

解释性语言和编译性语言的定义:

计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。

翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。

解释性语言的定义:

解释性语言的程序不需要编译,在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就需要逐行翻译一次,效率比较低。

现代解释性语言通常把源程序编译成中间代码,然后用解释器把中间代码一条条翻译成目标机器代码,一条条执行。
常见的解释性语言: Python、JavaScript、PHP、Shell、MATLAB

编译性语言的定义:

编译性语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。

常见的编译型语言:C/C++、Pascal/Object Pascal(Delphi)
关于Web面试的基础知识点(一)
图片原地址

10.Javascript全局

js的全局属性: Infinity、NAN、undefined

js的全局函数
decodeURI()、decodeURIcomponent()、 encodeURI、encodeURIcomponent()、 scape()、eval()、isFinite()、isNAN()、 Number()、parseFloat()、parseInt()、String()、unescape()。

相关标签: NowCoder刷题笔记