1. 如果不给cookie设置过期时间会怎么样?
Answer:在浏览器会话结束时过期。
Analysis:
cookie的有效时间默认为-1,如果不进行设置的话,就会默认在浏览器会话关闭时结束;
可以通过setMaxAge()方法设置cookie的生命周期;
当setMaxAge(0)表示立刻删除该浏览器上指定的cookie。
2. []、{}、null、undefined、’’ or ""的区别和比较
Number([]) //0
Boolean([]) //true
String([]) //""
typeof [] //"object"
Number({}) //NaN
Boolean({}) //true
String({}) //"[object Object]"
typeof {} //"object"
Number(null) //0
Boolean(null) //false
String(null) //"null"
typeof null //object
Number(undefined) //NaN
Boolean(undefined) //false
String(undefined) //"undefined"
typeof undefined //undefined
Number('') or Number("") //0
Boolean('') or Boolean("") //false
String('') or String("") //""
typeof '' or typeof "" //"string"
注:
== 是比较运算符,比较前将两边转换为Number型;
! 是逻辑运算符,比较前将两边转换为Boolean型。
比较:
1. NaN == NaN //false
Analysis:NaN与任何值都不相等,包括其本身。
2. null == undefined //true
Analysis:JavaScript规范中提到,在比较相等性之前,不能将null和undefined转换为其他任何值,并且规定null和undefined是相等的。
3. null === undefined //false
Analysis:全等状态下,null和undefined不属于同一数据类型。
4. undefined和null与任何有意义的值比较返回的都是false,但是null与undefined之间互相比较返回的是true。
null == 0 //false
null == false //false
null == true //false
undefined== 0 //false
undefined == false //false
undefined== true //false
3. JavaScript定义一个函数的方法有哪些?调用函数的方法有哪些?
点此查看详解
定义函数方法
①函数关键字(function)语句:
function fnMethodName(x) {alert(x);}
②函数字面量(Function Literals):
var fnMethodName = function(x){alert(x);}
③Function()构造函数:
var fnMethodName = new Function(‘x’,‘alert(x)’);
上面三种方法定义了同一个方法函数fnMethodName,第一种是最常用的方法,后两种都是将一个函数赋值给变量fnMethodName,而这个函数自己是没有名字的,即匿名函数。
注:函数字面量不是函数声明,同理,构造函数也不是函数声明。
调用函数方法
①方法调用模式
var obj = {
id:123,
name:"kuku",
show:function(){alert(this.id);} //如果这里不要this则会报错:Uncaught ReferenceError: id is not defined.
}
obj.show();
②函数调用模式
var sum = function(a,b) {
alert(a+b);
}
sum(3,4);
③构造器调用模式
var func = function(a) { //定义一个函数对象
this.a = a; //在对象中定义属性
}
func.prototype = {
show:function(){alert(this.a);} //在其原型对象中定义方法
}
var myFunc = new func("123"); //在使用prototype的方法时,必须实例化该对象才能调用其方法
myFunc.show();
④apply和call调用模式
var myFunc = function(a,b) {
return a-b;
}
var result1 = myFunc.call(this,30,10);
var result2 = myFunc.apply(this,[30,10]);
alert("result1:" + result1 + ",result2:" + result2);
4. JS数组方法有哪些?
点此查看详解
5.JS中apply、call、bind的用法和区别?
用途:手动改变this的指向。
区别:
(1)apply和call会使当前函数立即执行,bind会返回一个函数,后续需要时再调用。
(2)call是apply的语法糖,只有传的参数不同,call中要传多个任意参数,apply只可以直接传数组或者类数组
call( thisArg, [arg1, arg2,… ] ); // 参数列表,arg1,arg2,…
apply(thisArg, argArray); // 参数数组,argArray
(3)bind是为函数绑定一个this上下文。
规则:
fn.apply(上下文环境,执行所需数组)
fn.call(上下文环境,执行所需单个参数)
fn.bind(上下文环境)
注:
如果这个函数处于非严格模式下,则指定上下文为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装;apply可以将一个数组转换为一个参数列表([p1,p2,p3]转换为p1,p2,p3)。
示例1:
var foo = {
name:"mingming",
logName:function(){
console.log(this.name);
}
}
var bar={
name:"xiaowang"
};
foo.logName.call(bar); //xiaowang
示例2:
var arr=[1,2,3,4]
//Math.max()只能传数字,可以使用apply将数组转为一个一个参数传入
console.log (Math.max.apply(null,arr)) //4
6. JavaScript对象
一、内置对象
Array、Boolean、Date、Math、Number、Object、RegExp、 String、Global、Function。
二、浏览器对象
三、图解JavaScript各类型关系
1、内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始化阶段就被创建好的对象,是后者的一个子集;而后者包括了一些在运行过程中动态创建的对象。
2、引擎扩展对象是一个并不太大的集合,一般来说比较确定,它们也属于引擎的原生对象(但不属于ECMA规范的原生对象)。
3、宿主对象不是引擎的原生对象,而是由宿主框架通过某种机制注册到 JavaScript 引擎中的对象。
4、一些宿主会把自己提供的对象/构造器也称为“原生对象”,例如 Internet Explorer 7 就把它提供的 XMLHttpRequest() 称为原生的——与此相对的是在它的更早先版本中通过 new ActiveXObject(‘Microsoft.XMLHTTP’) 这样的方法创建的对象。这种情况下,读者应注意到“宿主的原生对象”与“引擎的原生对象”之间的差异。
7. JS事件冒泡
“在一个对象上触发某类事件,这个事件会向这个对象的的父级传播,从里到外,直至它被处理或者到达了对象层次的最顶层,即document对象。这个过程就是JavaScript的事件冒泡。”
通过events.bubbles可以查询事件是否可以冒泡。
什么是事件冒泡:点此查看详解
冒泡事件与不冒泡事件有哪些(总结):点此查看详解
记住不冒泡的事件:abort、error、resize、blur、focus、load、unload、mouseenter、mouseleave。
8. Math.around()方法
点此查看详解
round() 方法可把一个数字舍入为最接近的整数。
对于 0.5,该方法将进行上舍入。
例如,3.5 将舍入为 4,而 -3.5 将舍入为 -3。
其他:
Math.ceil 向上取整
Math.floor 向下取整
9. js变量提升与函数提升
变量声明提升(只提升声明,赋值位置保持不变);
函数声明整个提升(如同剪切);
点击查看详解
栗子:
function foo() {
console.log(a);
var a = 1;
console.log(a);
function a() {}
console.log(a);
console.log(b);
var b = 2;
console.log(b);
function b() {}
console.log(b);
}
foo();
js是这样解析的:
function foo() {
var a; //变量声明提升
var b; //变量声明提升
function a() {} //函数声明提升
function b() {} //函数声明提升
console.log(a); // a()
a = 1; //变量赋值位置保持不变
console.log(a); // 1
console.log(a); // 1
console.log(b); // b()
b = 2;
console.log(b); // 2
console.log(b);// 2
}
foo();
10.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 socket协议。