Cookie、数组方法、定义函数、apply、call、bind、JS对象、变量提升、跨域、事件冒泡

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之间互相比较返回的是truenull == 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)。

示例1var foo = {
  name:"mingming",
  logName:function(){
    console.log(this.name);
  }
}
var bar={
  name:"xiaowang"
};
foo.logName.call(bar); //xiaowang

示例2var 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协议。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值