1、js有哪些数据类型
基本数据类型:String,Boolean, Number, Null, Undefined
引用数据类型:Obeject(Array,Date,RegExp,Function)
//那么问题来了,如何判断某变量是否是数组类型
1、判断其是否具有"数组性质",如slice()。可自己给该变量定义slice方法,故有时会失效
2、obj instanceof Array 在某些IE版本中不正确(但是经过测试,未发现不兼容问题)
3、在ECMA Script5中定义了新方法Array.isArray(),但是此方法不兼容ie8,为了更好的兼容浏览器,可如下处理:
//定义变量
var arr = ['0','1','2'];
//判断浏览器是否支持isArray方法,Array.isArray === undefined,则浏览器不支持此方法
if(typeof Array.isArray === "undefined"){
//定义方法
Array.isArray = function(arg){
//Object.prototype.toString.call()方法可查看http://www.zhufengpeixun.cn/JavaScriptmianshiti/2014-02-28/271.html
return Object.prototype.toString.call(arg) === "[object Array]";
};
};
console.log(Array.isArray(arr)); -->true
2、如果一个div,宽度为100px,padding-top:20%,试问这个元素的高度是多少。
所有元素的padding margin 百分比都跟其父元素的宽度有关,对应的比例是其父元素宽度的比例。
<div style="width:200px;">
<div style="width: 100px;padding-top: 20%;"></div>
</div>
//如父级元素div宽度为200px;那么子级元素div的高度为200*20%=40px;
3、什么是ajax,以及ajax常见状态码
Ajax是异步JavaScript和XML,用于在Web页面中实现异步数据交互。
XMLHttpRequest,status:
1xx-信息提示 这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接受衣一个或多个1xx响应。
100-继续
2xx-成功
这类状态代码表明服务器成功地接受了客户端请求。
200-确定。客户端请求已成功。
201-已创建。
202-已接受。
203-非权威性信息。
204-无内容。
205-重置内容。
206-部分内容。
3xx-重定向
客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。
301-对象已永久移走,即永久重定向。
302-对象已临时移动。
304-未修改。
307-临时重定向。
4xx-客户端错误
发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。400-错误的请求。
401-访问被拒绝。IIS定义了许多不同的401错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在IIS日志中显示:
401.1-登录失败。
401.2-服务器配置导致登录失败。
401.3-由于ACL对资源的限制而未获得授权。
401.4-筛选器授权失败。
401.5-ISAPI/CGI应用程序授权失败。
401.7–访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS6.0所专用。
403-禁止访问:IIS定义了许多不同的403错误,它们指明更为具体的错误原因:
403.1-执行访问被禁止。
403.2-读访问被禁止。
403.3-写访问被禁止。
403.4-要求SSL。
403.5-要求SSL128。
403.6-IP地址被拒绝。
403.7-要求客户端证书。
403.8-站点访问被拒绝。
403.9-用户数过多。
403.10-配置无效。
403.11-密码更改。
403.12-拒绝访问映射表。
403.13-客户端证书被吊销。
403.14-拒绝目录列表。
403.15-超出客户端访问许可。
403.16-客户端证书不受信任或无效。
403.17-客户端证书已过期或尚未生效。
403.18-在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS6.0所专用。
403.19-不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS6.0所专用。
403.20-Passport登录失败。这个错误代码为IIS6.0所专用。
404-未找到。
404.0-(无)–没有找到文件或目录。
404.1-无法在所请求的端口上访问Web站点。
404.2-Web服务扩展锁定策略阻止本请求。
404.3-MIME映射策略阻止本请求。
405-用来访问本页面的HTTP谓词不被允许(方法不被允许)
406-客户端浏览器不接受所请求页面的MIME类型。
407-要求进行代理身份验证。
412-前提条件失败。
413–请求实体太大。
414-请求URI太长。
415–不支持的媒体类型。
416–所请求的范围无法满足。
417–执行失败。
423–锁定的错误。
5xx-服务器错误
服务器由于遇到错误而不能完成该请求。
500-内部服务器错误。
500.12-应用程序正忙于在Web服务器上重新启动。
500.13-Web服务器太忙。
500.15-不允许直接请求Global.asa。
500.16–UNC授权凭据不正确。这个错误代码为IIS6.0所专用。
500.18–URL授权存储不能打开。这个错误代码为IIS6.0所专用。
500.100-内部ASP错误。
501-页眉值指定了未实现的配置。
502-Web服务器用作网关或代理服务器时收到了无效响应。
502.1-CGI应用程序超时。
502.2-CGI应用程序出错。application.
503-服务不可用。这个错误代码为IIS6.0所专用。
504-网关超时。
505-HTTP版本不受支持。
4、看下列代码输出为何?解释原因。
var a;
alert(typeof a); // undefined
alert(b); // 报错
// 解释:Undefined是一个只有一个值的数据类型,这个值就是“undefined”,在使用var声明变量但并未对其赋值进行初始化时,这个变量的值就是undefined。而b由于未声明将报错。注意未申明的变量和声明了未赋值的是不一样的。
var a = null;
alert(typeof a); //object
// 解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”
5、看下面的代码,输出什么,foo的类型为什么?
var foo = "11"+2-"1";
console.log(foo);
console.log(typeof foo);
//执行完后foo的值为111,foo的类型为Number。
var foo = "11"+2+"1"; //体会加一个字符串'1' 和 减去一个字符串'1'的不同
console.log(foo);
console.log(typeof foo);
//执行完后foo的值为1121(此处是字符串拼接),foo的类型为String。
6、var numberArray = [3,6,2,4,1,5]; (考察基础API)
- 实现对该数组的倒排,输出[5,1,4,2,6,3]
- 实现对该数组的降序排列,输出[6,5,4,3,2,1]
var numberArray = [3,6,2,4,1,5];
numberArray.reverse(); // 5,1,4,2,6,3
numberArray.sort(function(a,b){ //6,5,4,3,2,1
return b-a;
})
7、为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义
function escapeHtml(str) {
return str.replace(/[<>”&]/g, function(match) {
switch (match) {
case “<”:
return “<”;
case “>”:
return “>”;
case “&”:
return “&”;
case “\””:
return “"”;
}
});
}
8、看下面代码,给出输出结果。
for(var i=1;i<=3;i++){
setTimeout(function(){
console.log(i);
},0);
};
## 答案是4 4 4
//原因:Javascript事件处理器在线程空闲之前不会运行。那么问题来了,如何让上述代码输出1 2 3?
for(var i=1;i<=3;i++){
setTimeout((function(a){ //改成立即执行函数
console.log(a);
})(i),0);
};
## 输出1 2 3
9、如何消除一个数组里面重复的元素?
##哈希表去重算法
var arr = [1, 2, 3, 3, 4, 4, 5, 5, 6, 1, 9, 3, 25, 4];
function deRepeat() {
var newArr = []; //newArr为临时数组
var obj = {}; //obj为hash表
var index = 0;
var l = arr.length;
for (var i = 0; i < l; i++) {
if (obj[arr[i]] == undefined) { //如果hash表中没有当前选项
obj[arr[i]] = 1; //存入hash表
newArr[index++] = arr[i];
} else if (obj[arr[i]] == 1) //hash表中有当前选项
continue;
}
return newArr;
}
var newArr2 = deRepeat(arr);
alert(newArr2); //输出1,2,3,4,5,6,9,25
10、下面这个ul,如何点击每一列的时候alert其index?(闭包)
<ul id=”test”>
<li>这是第一条</li>
<li>这是第二条</li>
<li>这是第三条</li>
</ul>
答案:
var li = document.getElementsById("test").getElementsByTagName("li");
## 方法一
for(var i = 0;i < li.length; i++){
li[i].index = i;
li[i].onclick = function(){
alert(this.index)
}
};
## 方法二
for(var i = 0; i < li.length; i++){
li[i].index = i;
li[i].onclick = (function(a){
return function(){
alert(a)
}
})(i);
};
11、定义一个log方法,让它可以代理console.log的方法。
function log(msg){
console.log("msg");
};
log('hello world!');
## 如果要传入多个参数呢?显然上面的方法不能满足要求,所以更好的方法是:
function log() {
console.log.apply(console, arguments);
};
那么问题来了,apply和call方法的异同?
答案:
对于apply和call两者在作用上是相同的,即是调用一个对象的一个方法,以另一个对象替换当前对象。将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
但两者在参数上有区别的。对于第一个参数意义都一样,但对第二个参数: apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。 如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3]) 。
更多详细信息,请参考
网友评论