面试题
1 . Array.isArray(Array.prototype)输出什么? true
Array.prototype==[constructor:Array,xxx:function(){}] 所以是true
2.
var a=new Array(2); console.log(a); //[undefined×2]数组构造函数参数是占位符 var b=new String(2); console.log(b);//String {0: "2", length: 1, [[PrimitiveValue]]: "2"} 对象
3.
var a=3; function c(){ alert(a); } (function(){ var a=4; c(); //3 在自执行函数中没有a变量,会沿着作用域链向上寻找,与定义的作用域有关,与执行作用域无关 })();
var a=3; function c(a){ alert(a); } (function(){ var a=4; c(a); //4 执行c函数时,先进行形参赋值,再执行的作用域查找 })();
4.如何准确判断一个变量是数组类型?
var ary=[]; console.log(ary instanceof Array); //true console.log(Object.prototype.toString.call(ary)) //[object Array]
5.写New 构造函数创建一个实例的过程
1.构造函数中this指向实例
2.执行代码对this的属性、方法赋值
3.隐式的从函数中返回出来
6.构造函数的特点
1.函数名首字母大写;
2.函数内不创建对象,也不显示返回对象;
3.函数内属性、方法添加到this上
4.实例需要New出来
5.创造一个类,
7.// 找出对象 obj 不在原型链上的属性(注意这题测试例子的冒号后面也有一个空格~)
// 1、返回数组,格式为 key: value
// 2、结果数组不要求顺序
题目
var C = function() {this.foo = 'bar'; this.baz = 'bim';}; C.prototype.bop = 'bip'; console.log(iterate(new C()));/*["foo: bar", "baz: bim"]*/
答案:
function iterate(callback){ var ary=[]; for(var key in callback){ // 判断是不是私有属性 if (callback.hasOwnProperty(key)){ ary[ary.length]=callback[key] } } return ary }
8.有关浏览器的内核判断
主要分为四类:-o-/-ms-/-moz-/-webkit-
通过js的dom.style.XxxTransition进行相应的校验判断:
var div = document.createElement('div'); var style = div.style; if (style.webkitTransition) { return '-webkit-'; } if (style.MozTransition) { return '-moz-'; } if (style.oTransition) { return '-o-'; } if (style.msTransition) { return '-ms-'; } return '';
9.页面的reflow渲染与repaint重绘
reflow渲染:对dom元素结构进行渲染;同时他会自动触发repaint页面重绘;它会改变自身和所有父元素,这种开销是非常昂贵的,页面元素越多,性能的下降会越明显;
repaint重绘:当进行重绘时,元素的外观会被改变,不过页面重绘不会影响dom结构的渲染;
display属性值会产生reflow和repaint;而visibility元素只会产生repaint而不会产生reflow
10.css的单位值归纳
主要分为四种:px/em/rem/%
px:相对于长度的绝对值单位,像素px是相对于屏幕分辨率而言的
em:em是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。最初是指字母M的宽度,故名em。现指的是字符宽度的倍数,用法类似百分比,如:0.8em, 1.2em,2em等。通常1em=16px。
rem:css3新增的一个单位值,与em的区别在于设置字体时,相对的是html的根元素的字体颜色,这样就可以只需修改根元素的字体就可以调整所有的单位值了,避免了一些字体大小逐层符合引起的连锁反应;目前除了IE8及以下版本外的浏览器均支持给属性;
%:百分比的单位值设置,相对于当前元素的父元素的对应属性的宽度和高度的值进行设置
11.算法
console.log(1+ +"2"+"2"); //1+ Number(2)+"2"= "32" console.log("A"- "B"+"2"); //NaN+"2"=NaN
console.log("A"- "B"+2); //NaN+"2"=NaN
12.定义变量问题
(function test(){ var a=b=1; //自执行函数作用域中定义a ,同时b没有在该作用域找到,所以在全局定义了b 人话: 私有变量a=全局变量b=1; })(); console.log(a); //全局没有a a is not defined console.log(b); //错误了,不执行
13.判断JS代码的值
<SCRIPT LANGUAGE="JavaScript"> var bb = 1; function aa(bb) { bb = 2; alert(bb); }; aa(bb); //2 alert(bb); //1 </SCRIPT>
JS传递参数是以值得方式进行传参,就是,参数再里面怎么变,外面不变
14.call与apply方法
function add(c, d){ return this.a + this.b + c + d; } var o = {a:1, b:3}; add.call(o, 5, 7); //1+3+5+7 add.apply(o, [10, 20]); //1+3+10+20
call,apply,bind都是Function.prototype上的方法,任何的Function的实例都可以调用他(主要指函数)
15.边框0与none不一样
border:none;表示边框的样式无,而border: 0表示边框的宽度为0,这两者在效果上是一样的,但是在实现上是不同的;同时需要注意的是,在设置了border-width时,还需要设置border-style,否则border不会显示出来的
16.如何获取一个字符串中的数字字符,并按数组形式输出,如
dgfhfgh254bhku289fgdhdy675gfh
输出[254,289,675]
方法一
var ary=[]; var temp=""; for(var i=0;i<str.length;i++){ // 1.判断是否是数字 if (str.charAt(i)<10&&str.charAt(i)>=0){ // 2.是数字,添加到字符串中 temp+=str.charAt(i) }else{ // 3.不是数字,判断temp是否为空 if (temp){ // 4.不为空,一起添加到数组中 ary[ary.length]=temp; temp=""; } } } console.log(ary)
方法二
console.log(str.match(/\d+/g))
17.判断字符串中是否有连续的字母,有返回true,没有反之
console.log(/([a-zA-Z])\1/.test("asdasd"))
\1是重复第一个分组
18.判断是否以元音字母结尾
console.log(/[a,e,i,o,u]$/.test("zoo"));
19.截取字符串
给定字符串 str,检查其是否包含 3 个连续的数字
1、如果包含,返回最新出现的 3 个数字的字符串
2、如果不包含,返回 false**
var str="asdasd154asd"; function sliceStr(){ var reg=/\d{3}/; var res=""; if (res=reg.exec(str)){ return res[0] }else{ return false } } console.log(sliceStr())
20.给定字符串 str,检查其是否符合如下格式
1、XXX-XXX-XXXX
2、其中 X 为 Number 类型**
var reg=/^(\d{3}-){2}\d{4}$/;
console.log(reg.test(str))
21.判断是否符合 USD 格式
**给定字符串 str,检查其是否符合美元书写格式
1、以 $ 开始
2、整数部分,从个位起,满 3 个数字用 , 分隔
3、如果为小数,则小数部分长度为 2
4、正确的格式如:$1,023,032.03 或者 $2.03,错误的格式如:$3,432,12.12 或者 $34,344.3**
var str="$1,023,032.03"; var reg=/^\$\d{1,3}(,\d{3})*(\.\d{2})?$/; console.log(reg.test(str))
22.敏感词过滤
例子:敏感词过滤,比如 我爱北京天安门,天安门上太阳升。------我爱*****,****上太阳升。即北京和天安门变成*号,
var str="我爱北京天安门,天安门上太阳升"; var reg=/北京|天安门/g; str=str.replace(reg,function(){ var l="" for(var i=0;i<arguments[0].length;i++){ l+="*" } return l })
23.让2013-6-7 变成 2013.6.7
str=str.replace(reg,function($0,$1,$2){ console.log($0) // $0.,每一轮整个匹配结果 // $1.第一个分组的匹配结果 // $2.第二个分组的匹配结果 return $1+"." }); console.log(str)