《javascript高级程序设计》
什么是javascript?
一种直译式脚本语言,是一种动态类型、弱类型、面向对象、基于原型的语言,内置支持类型。它的解释器被称为javascript引擎,为浏览器的一部分,广泛用于客户端的脚本语言。
Javascript的数据类型有哪些?
Undefined;null;boolean;string;number;symbol;object
Undefined:未定义。
Null:定义了但是为空,即定义了但是还没有赋值。
Boolean:true/false。
String:字符串,有最大长度。
Number:数字,有几种特殊情况:NaN;infinity(无穷大);-infintty(负无穷大)
什么是对象?
对象具有唯一性,唯一标识是内存地址,在js中,对象所有的属性和方法都归纳为“属性”(js中对象的行为和状态都能用属性来抽象),并且和c++和java不同,js中对象的属性(包括方法)可以在运行中更改。js语言标准已经说明,js是一门面向对象的语言,我想标准中能这样说,正是因为js的高度动态性的对象系统(js的对象系统具有极高的灵活性)。js是基于原型的面向对象的脚本语言,es6中引入了class定义类的方式,new和function搭配的怪异方式终于可以退休了,任何场景winter都推荐使用class类的写法。类的写法实际上也是由原型运行时承载的,逻辑上javascript认为每个类是由共同原型的一组对象,类中定义的方法和属性则会被写在原型对象之上。
面对对象和基于对象有什么区别?
面向对象的三大特点(封装,继承,多态)缺一不可。通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些,的确很饶口。简单地说:基于对象不能继承,更谈不上多态.
有哪些方法可以获取原型对象?
1:从构造函数获取原型对象
构造函数.prototype
2:从对象实例获取父级原型对象
a:对象实例._proto_ (有兼容性问题,不建议使用)
b:object.getprototypeof(对象实例)
javascript中的对象有哪些?
宿主对象(取决于js的运行环境,比如运行在浏览器则由windos对象)
内置对象(内置对象又分为:固有对象;原生对象;普通对象)
宏观任务和微观任务有什么区别?
宿主发生的任务叫宏观任务,js引擎发起的任务叫微观任务,微任务优先于宏任务。我们首先应该形成一个感性的认知:一个javascript引擎会常驻于内存中,它等待着我们(宿主)把js代码或者函数传递给它执行。
确定异步代码执行顺序,我们这样总结:
1:首先我们分析有多少个宏任务;
2:在每个宏任务中,分析有多少个微任务;
3:根据调用次序,确定宏任务中的微任务执行次序;
4:根据宏任务的出发规则和调用次序,确定宏任务的执行次序;
5:确定整个顺序。
哪些语句会因为let而产生作用域?
var声明变量有很多瑕疵,后来引入了let。为了实现let,js在运行时引入了块级作用域。也就是,在let出现之前,js的if for等语句皆不会产生作用域。简单统计,以下语句会产生let的使用的作用域:for;if;switch;try/catch/finally。题外话:立即执行函数,可以构造一个新的域,从而控制var的范围(立即执行函数前应该加分号,或者加void)
js代码到底要不要加分号?
关于分号,大部分时候不用加分号,少部分要注意:
1:以括号开头的语句,如立即执行函数
2:以数组开头的语句,可能被解析成下标
3:以正则表达式开头的语句,斜杠可能被解析成除号
4:以template开头的语句