$JavaScript(2)
21、javascript有哪些方法定义对象
-
对象字面量:
var obj = {};
-
构造函数:
var obj = new Object();
-
Object.create():
var obj = Object.create(Object.prototype);
22、常见兼容性问题?
-
png24
位的图片在iE6浏览器上出现背景,解决方案是做成PNG8
-
浏览器默认的
margin
和padding
不同。解决方案是加一个全局的*{margin:0;padding:0;}
来统一,,但是全局效率很低,一般是如下这样解决:
body,ul,li,ol,dl,dt,dd,form,input,h1,h2,h3,h4,h5,h6,p{ margin:0; padding:0; }
-
IE
下,event
对象有x
,y
属性,但是没有pageX
,pageY
属性 -
Firefox
下,event
对象有pageX
,pageY
属性,但是没有x,y
属性.
22、说说你对promise的了解
-
依照
Promise/A+
的定义,Promise
有四种状态:-
pending:
初始状态, 非fulfilled
或rejected.
-
fulfilled:
成功的操作. -
rejected:
失败的操作. -
settled: Promise
已被fulfilled
或rejected
,且不是pending
-
-
另外,
fulfilled
与rejected
一起合称settled
-
Promise
对象用来进行延迟(deferred
) 和异步(asynchronous
) 计算
Promise 的构造函数
-
构造一个
Promise
,最基本的用法如下:
var promise = new Promise(function(resolve, reject) { if (...) { // succeed resolve(result); } else { // fails reject(Error(errMessage)); } });
-
Promise
实例拥有then
方法(具有then
方法的对象,通常被称为thenable
)。它的使用方法如下:
promise.then(onFulfilled, onRejected)
-
接收两个函数作为参数,一个在
fulfilled
的时候被调用,一个在rejected
的时候被调用,接收参数就是future
,onFulfilled
对应resolve
,onRejected
对应reject
23、你觉得jQuery源码有哪些写的好的地方
-
jquery
源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入window
对象参数,可以使window
对象作为局部变量使用,好处是当jquery
中访问window
对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问window对象。同样,传入undefined
参数,可以缩短查找undefined
时的作用域链 -
jquery
将一些原型属性和方法封装在了jquery.prototype
中,为了缩短名称,又赋值给了jquery.fn
,这是很形象的写法 -
有一些数组或对象的方法经常能使用到,
jQuery
将其保存为局部变量以提高访问速度 -
jquery
实现的链式调用可以节约代码,所返回的都是同一个对象,可以提高代码效率
24、vue、react、angular
-
Vue.js
一个用于创建web
交互界面的库,是一个精简的MVVM
。它通过双向数据绑定把View
层和Model
层连接了起来。实际的DOM
封装和输出格式都被抽象为了Directives
和Filters
-
AngularJS
是一个比较完善的前端MVVM
框架,包含模板,数据双向绑定,路由,模块化,服务,依赖注入等所有功能,模板功能强大丰富,自带了丰富的Angular
指令 -
react
React
仅仅是VIEW
层是facebook
公司。推出的一个用于构建UI
的一个库,能够实现服务器端的渲染。用了virtual dom
,所以性能很好。
25、Node的应用场景
-
特点:
- 1、它是一个
Javascript
运行环境 - 2、依赖于
Chrome V8
引擎进行代码解释 - 3、事件驱动
- 4、非阻塞
I/O
- 5、单进程,单线程
- 1、它是一个
-
优点:
- 高并发(最重要的优点)
-
缺点:
- 1、只支持单
核CPU
,不能充分利用CPU
- 2、可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
- 1、只支持单
26、谈谈你对AMD、CMD的理解
-
CommonJS
是服务器端模块的规范,Node.js
采用了这个规范。CommonJS
规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD
规范则是非同步加载模块,允许指定回调函数 -
AMD
推荐的风格通过返回一个对象做为模块对象,CommonJS
的风格通过对module.exports
或exports
的属性赋值来达到暴露模块对象的目的
27、那些操作会造成内存泄漏?
-
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在
-
setTimeout
的第一个参数使用字符串而非函数的话,会引发内存泄漏 -
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
28、web开发中会话跟踪的方法有哪些
-
cookie
-
session
-
url
重写 -
隐藏
input
-
ip
地址
29、介绍js的基本数据类型
-
Undefined
、Null
、Boolean
、Number
、String
30、介绍js有哪些内置对象?
-
Object
是JavaScript
中所有对象的父对象 -
数据封装类对象:
Object
、Array
、Boolean
、Number
和String
-
其他对象:
Function
、Arguments
、Math
、Date
、RegExp
、Error
31、说几条写JavaScript的基本规范?
-
不要在同一行声明多个变量
-
请使用
===/!==
来比较true/false
或者数值 -
使用对象字面量替代
new Array
这种形式 -
不要使用全局函数
-
Switch
语句必须带有default
分支 -
If
语句必须使用大括号 -
for-in
循环中的变量 应该使用var
关键字明确限定作用域,从而避免作用域污
32、JavaScript有几种类型的值?,你能画一下他们的内存图吗?
-
栈:原始数据类型(
Undefined
,Null
,Boolean
,Numbe
r、String
) -
堆:引用数据类型(对象、数组和函数)
-
两种类型的区别是:存储位置不同;
-
原始数据类型直接存储在栈(
stack
)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储; -
引用数据类型存储在堆(
heap
)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其 -
在栈中的地址,取得地址后从堆中获得实体
33、javascript创建对象的几种方式?
-
对象字面量的方式
person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
-
用
function
来模拟无参的构造函数
function Person(){} var person=new Person();//定义一个function,如果使用new"实例化",该function可以看作是一个Class person.name="Mark"; person.age="25"; person.work=function(){ alert(person.name+" hello..."); } person.work();
-
用
function
来模拟参构造函数来实现(用this
关键字定义构造的上下文属性)
function Pet(name,age,hobby){ this.name=name;//this作用域:当前对象 this.age=age; this.hobby=hobby; this.eat=function(){ alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序员"); } } var maidou =new Pet("麦兜",25,"coding");//实例化、创建对象 maidou.eat();//调用eat方法
-
用工厂方式来创建(内置对象)
var wcDog =new Object(); wcDog.name="旺财"; wcDog.age=3; wcDog.work=function(){ alert("我是"+wcDog.name+",汪汪汪......"); } wcDog.work();
-
用原型方式来创建
function Dog(){ } Dog.prototype.name="旺财"; Dog.prototype.eat=function(){ alert(this.name+"是个吃货"); } var wangcai =new Dog(); wangcai.eat();
-
用混合方式来创建
function Car(name,price){ this.name=name; this.price=price; } Car.prototype.sell=function(){ alert("我是"+this.name+",我现在卖"+this.price+"万元"); } var camry =new Car("凯美瑞",27); camry.sell();
34、eval是做什么的?
-
它的功能是把对应的字符串解析成
JS
代码并运行 -
应该避免使用
eval
,不安全,非常耗性能(2
次,一次解析成js
语句,一次执行) -
由
JSON
字符串转换为JSON对象的时候可以用eval,var obj =eval('('+ str +')')
35、null,undefined 的区别?
-
undefined
表示不存在这个值。 -
undefined
:是一个表示"无"的原始值或者说表示"缺少值",就是此处应该有一个值,但是还没有定义。当尝试读取时会返回undefined
-
例如变量被声明了,但没有赋值时,就等于
undefined
-
null
表示一个对象被定义了,值为“空值” -
null
: 是一个对象(空对象, 没有任何属性和方法) -
例如作为函数的参数,表示该函数的参数不是对象;
-
在验证
null
时,一定要使用===
,因为==
无法分别null
和undefined
36、["1", "2", "3"].map(parseInt) 答案是多少?
-
[1, NaN, NaN]
因为parseInt
需要两个参数(val, radix)
,其中radix
表示解析时用的基数。 -
map
传了3
个(element, index, array)
,对应的radix
不合法导致解析失败。
37、javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?
-
use strict
是一种ECMAscript 5
添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,使JS
编码更加规范化的模式,消除Javascript
语法的一些不合理、不严谨之处,减少一些怪异行为
38、JSON 的了解?
-
JSON(JavaScript Object Notation)
是一种轻量级的数据交换格式 -
它是基于
JavaScript
的一个子集。数据格式简单, 易于读写, 占用带宽小 -
JSON
字符串转换为JSON对象:
var obj =eval('('+ str +')'); var obj = str.parseJSON(); var obj = JSON.parse(str);
JSON
对象转换为JSON字符串:
var last=obj.toJSONString(); var last=JSON.stringify(obj);
39、js延迟加载的方式有哪些?
-
defer
和async
、动态创建DOM
方式(用得最多)、按需异步载入js
40、同步和异步的区别?
-
同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作
-
异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容