JS笔试题

1,考察this

var length = 10
function fn(){
alert(this.length)
}
var
obj = {
length: 5,
method: function(fn) {
fn() // ?

arguments[0]() // ?

}
}
obj.method(fn)
这里的坑主要是arguments,我们知道取对象属于除了点操作符还可以用中括号,这里fn的scope是arguments,即fn内的this===arguments,调用时仅传了一个参数fn,因此length为1。

2,函数表达式具名(函数声明同时赋值给另一个变量)或函数声明立即执行时,名仅在该函数内可访问

~function() {
alert(typeof next) // ?
~function next()
{
alert(typeof next) // ?

}()
}()
外层匿名函数自执行,打印next,接着内层具名函数自执行。会发现具名的next仅在其自身函数体内可访问,即输出为function。外面是不可见的,typeof就为undefined了。(注:此题IE6/7/8中输出为function
function, 标准浏览器为undefined function)

同样的情况也发生在将具名函数赋值给一个变量时,如下

var func = function a() {
alert(typeof a)
}
func() //
?
alert(typeof a) //
?
这条规则是标准中(ES3/ES5)都已明确指出,但IE6、7、8没有严格遵从。可参见w3help的分析或李松峰老师的翻译《命名函数表达式探秘》

3,给基本类型数据添加属性,不报错,但取值时是undefined

a = 3
a.prop = 4
alert(a + a.prop) //
?
变量a为数字3,给其添加prop属性,值为4(奇怪吧在JS中这是允许的,且不会有语法错误)。然后alert出a+a.prop的结果。结果是NaN。a.prop为undefined,3+undefined为NAN。

举一反三,给字符串添加属性

str = ‘a‘
str.prop = ‘b‘
alert(str + str.prop) // ?
结果呢?

4,隐式的全局变量

var a = 1
function func() {
a = b =
2
}
func()
alert(a)
alert(b) // ?

JS中不用var声明的变量默认是全局变量,而这里的连等使的情况更加隐蔽。这里的b是全局的,因此func外可以访问。

5,变量声明早于代码运行(Scoping and Hoisting)

var uname = ‘jack‘
function change() {
alert(uname) // ?

var uname = ‘lily‘

alert(uname)
}
change()
这里容易犯迷糊的是第一个alert,如果认为函数change外已经声明赋值了,此时应该是jack,实际函数内又var了一次(虽然var在其后),预解析时仍然会将其置undefined。这也是为什么书里都建议变量声明都放在代码块的最前面。

6,函数声明早于变量声明

function change() {
alert(typeof fn) // ?
function fn()
{
alert(‘hello‘)
}
var
fn
}
change()
change内先alert出fn,后函数声明,再变量声明。如果fn没有函数声明而仅是变量声明,那么结果与5一样是undefined。但这里却是function。即同一个作用域内,函数声明放在代码块后面和前面都没有关系,函数可以正常使用。而变量声明则需先置前,先使用则是undefined。

JS笔试题,布布扣,bubuko.com

时间: 2024-12-22 08:01:56

JS笔试题的相关文章

容易答错的JS笔试题

1,考察this var length = 10 function fn(){     alert(this.length) } var obj = {     length: 5,     method: function(fn) {         fn() // ?         arguments[0]() // ?     } } obj.method(fn) 这里的坑主要是arguments,我们知道取对象属于除了点操作符还可以用中括号,这里fn的scope是arguments,即

这道JS笔试题你做对了吗?

昨天在看一道笔试题的时候本以为很简单,但是结果不是我想象的那样,直接上笔试题. const array = new Array(5).map((item) => { return item = { name: '1' } }); console.log(array); // 请写出输出结果 我想象的答案:[{name: '1'}, {name: '1'}, {name: '1'}, {name: '1'}, {name: '1'}]; 实际的答案:[empty × 5] 为什么会这样了? 猜想1

js笔试题系列之三——函数

在这一章以函数为主的讲解中,也会不可避免的牵涉到数组和对象的内容,这也不难理解,知识往后走牵涉的内容自然也越多. (1)经典作用域问题 题一: var a = 0 function f(){ console.log(a); ==>undefined var a = 2; console.log(a); ==>2 } f() 第二次日志输出结果相对容易理解,关键是第一次打印结果并不是全局变量中的a,因为按照作用域链的查找规则,在函数执行的时候会先查找局部作用域,而此时局部作用域已经存在变量a,只

蛮考验基础的JS笔试题(有坑小心!)

1.  考察this 1 var length = 10 2 function fn(){ 3 alert(this.length) 4 } 5 var obj = { 6 length: 5, 7 method: function(fn) { 8 fn() // ? 9 arguments[0]() // ? 10 } 11 } 12 obj.method(fn) 这里的坑主要是arguments,我们知道取对象属于除了点操作符还可以用中括号,这里fn的scope是arguments,即fn内

js笔试题系列之二——数组

(1)快速创建一个数组,数组中含有100个值为0元素. 方法一: var arr = new Array(100); for(var i=0;i<100;i++){ arr[i] = 0; } 方法二: var arr = new Array(100); arr.join('0').split(''); //注意此方法结果0为字符类型 面试官会喜欢哪个答案呢? (2)经典的数组去重问题 数组去重可以说是各大公司前端笔试中的常见题,以下列出几种典型的解决方法 方法一:传统双循环对比法 functi

由几道JS笔试题引发的知识点探究二——强制类型转换

强制类型转换的概念相信大家一定不陌生,例如整数和浮点数进行算术运算,整数会在后台转型为浮点数.JS作为一门弱类型的动态脚本语言,任何两种数据类型之间都可以进行性转换而不会报错,这就带来了一整套错综复杂的类型转换规则.例如我们的题目 alert('5'+5),大家都知道答案是'55',但为什么这里不将string转换成number而要将number转换成string呢?在其他情况下也都要将string转型成number吗?下面我们就来做一次完整的总结. 一.何时转型为boolean? 1. 逻辑非

由几道JS笔试题引发的知识点探究

1.JS有哪些全局函数? 2.alert('5'+5) 3.cookie.sessionStorage和localStorage的区别 4.call()和apply()方法的区别 5.严格模式和非严格模式有什么区别?严格模式有什么优缺点? 6.JS正则表达式 7.创建一个ul元素添加到body元素中,ul元素包含5个li元素,每个li元素有一个Text类型的子节点 8.sort()方法的应用 9.使用原生JS实现一个可拖拽的DIV 10.用AJAX判断浏览器是IE还是FireFox 11.异步加

js笔试题系列之——基础类型与运算符

前端技术的发展速度大家有目共睹,js的ECMA标准也不再是3的天下,但不管再怎么山雨欲来风满楼,基础语法还是得温故而知新.无论你是初学则还是多年js的编程者,都可以试着做做下面的测试题,我相信总还是会有些收获的.因为全部是自己总结和手打的,有纰漏错误之处请留言,谢谢. 一:考察基本数据类型与运算符 (1) var a; console.log(typeof a); ==>undefined 先以一个最常见也是最简单的测试案例开始,未定义的变量或者未赋值则为undefined (2) var a

js笔试题(不定期更新)

1 找出数字数组中最大的元素(使用Math.max函数) Math.max.apply(this, arr) 2 转化一个数字数组为function数组(每个function都弹出相应的数字) for(var i=0;i<arr.length;i++){ var tmp=arr[i]; arr[i]=function(tmp){ return function(){ alert(tmp); } }(tmp) } 或者 arr.map(function(e){ return function(){