前面几题是会很基础,越下越有深度。
1.JavaScript是一门什么样的语言,它有哪些特点?
没有标准答案。
2.JavaScript的数据类型都有什么?
基本数据类型:String,boolean,Number,Undefined, Null
引用数据类型:Object(Array,Date,RegExp,Function)
那么问题来了,如何判断某变量是否为数组数据类型?
1
2
3
4
5
6
|
if
(
typeof
Array
.
isArray
===
"undefined"
)
{
Array
.
isArray
=
function
(
arg
)
{
return
Object
.
prototype
.
toString
.
call
(
arg
)
===
"[object Array]"
}
;
}
|
3.已知ID的Input输入框,希望获取这个输入框的输入值,怎么做?(不使用第三方框架)
1
|
document
.
getElementById
(“
ID”
)
.
value
|
4.希望获取到页面中所有的checkbox怎么做?(不使用第三方框架)
1
2
3
4
5
6
7
8
|
var
domList
=
document
.
getElementsByTagName
(‘
input’
)
var
checkBoxList
=
[
]
;
var
len
=
domList
.
length
;
//缓存到局部变量
while
(
len
--
)
{
//使用while的效率会比for循环更高
if
(
domList
[
len
]
.
type
==
‘
checkbox’
)
{
checkBoxList
.
push
(
domList
[
len
]
)
;
}
}
|
5.设置一个已知ID的DIV的html内容为xxxx,字体颜色设置为黑色(不使用第三方框架)
1
2
3
|
var
dom
=
document
.
getElementById
(“
ID”
)
;
dom
.
innerHTML
=
“
xxxx”
dom
.
style
.
color
=
“
#
000”
|
6.当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做?
那么问题来了,Javascript的事件流模型都有什么?
7.什么是Ajax和JSON,它们的优缺点。
Ajax是异步JavaScript和XML,用于在Web页面中实现异步数据交互。
优点:
缺点:
JSON是一种轻量级的数据交换格式,ECMA的一个子集
优点:轻量级、易于人的阅读和编写,便于机器(JavaScript)解析,支持复合数据类型(数组、对象、字符串、数字)
8.看下列代码输出为何?解释原因。
1
2
3
|
var
a
;
alert
(
typeof
a
)
;
// undefined
alert
(
b
)
;
// 报错
|
解释:Undefined是一个只有一个值的数据类型,这个值就是“undefined”,在使用var声明变量但并未对其赋值进行初始化时,这个变量的值就是undefined。而b由于未声明将报错。注意未申明的变量和声明了未赋值的是不一样的。
9.看下列代码,输出什么?解释原因。
1
2
|
var
a
=
null
;
alert
(
typeof
a
)
;
//object
|
解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”。
10.看下列代码,输出什么?解释原因。
1
2
3
4
5
6
7
8
9
|
var
undefined
;
undefined
==
null
;
// true
1
==
true
;
// true
2
==
true
;
// false
0
==
false
;
// true
0
==
''
;
// true
NaN
==
NaN
;
// false
[
]
==
false
;
// true
[
]
==
!
[
]
;
// true
|
那么问题来了,看下面的代码,输出什么,foo的值为什么?
1
2
3
|
var
foo
=
"11"
+
2
-
"1"
;
console
.
log
(
foo
)
;
console
.
log
(
typeof
foo
)
;
|
执行完后foo的值为111,foo的类型为String。
11.看代码给答案。
1
2
3
4
5
|
var
a
=
new
Object
(
)
;
a
.
value
=
1
;
b
=
a
;
b
.
value
=
2
;
alert
(
a
.
value
)
;
|
答案:2(考察引用数据类型细节)
12.已知数组var stringArray = [“This”, “is”, “Baidu”, “Campus”],Alert出”This is Baidu Campus”。
答案:alert(stringArray.join(“”))
已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”。
1
2
3
4
5
6
7
8
|
function
combo
(
msg
)
{
var
arr
=
msg
.
split
(
"-"
)
;
for
(
var
i
=
1
;
i
<
arr
.
length
;
i
++
)
{
arr
[
i
]
=
arr
[
i
]
.
charAt
(
0
)
.
toUpperCase
(
)
+
arr
[
i
]
.
substr
(
1
,
arr
[
i
]
.
length
-
1
)
;
}
msg
=
arr
.
join
(
""
)
;
return
msg
;
}
|
(考察基础API)
13.var numberArray = [3,6,2,4,1,5]; (考察基础API)
1) 实现对该数组的倒排,输出[5,1,4,2,6,3]
2) 实现对该数组的降序排列,输出[6,5,4,3,2,1]
1
2
3
4
5
6
7
8
|
function
combo
(
msg
)
{
var
arr
=
msg
.
split
(
"-"
)
;
for
(
var
i
=
1
;
i
<
arr
.
length
;
i
++
)
{
arr
[
i
]
=
arr
[
i
]
.
charAt
(
0
)
.
toUpperCase
(
)
+
arr
[
i
]
.
substr
(
1
,
arr
[
i
]
.
length
-
1
)
;
}
msg
=
arr
.
join
(
""
)
;
return
msg
;
}
|
14.输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26
1
2
3
4
5
6
7
8
9
10
11
|
var
d
=
new
Date
(
)
;
// 获取年,getFullYear()返回4位的数字
var
year
=
d
.
getFullYear
(
)
;
// 获取月,月份比较特殊,0是1月,11是12月
var
month
=
d
.
getMonth
(
)
+
1
;
// 变成两位
month
=
month
<
10
?
'0'
+
month
:
month
;
// 获取日
var
day
=
d
.
getDate
(
)
;
day
=
day
<
10
?
'0'
+
day
:
day
;
alert
(
year
+
'-'
+
month
+
'-'
+
day
)
;
|
15.将字符串”<tr><td>{$id}</td><td>{$name}</td></tr>”中的{$id}替换成10,{$name}替换成Tony (使用正则表达式)
答案:”<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>”.replace(/{\$id}/g, ’10’).replace(/{\$name}/g, ‘Tony’);
16.为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function
escapeHtml
(
str
)
{
return
str
.
replace
(
/[<>”&]/g
,
function
(
match
)
{
switch
(
match
)
{
case
“
<”
:
return
“
&
lt
;”
;
case
“
>”
:
return
“
&
gt
;”
;
case
“
&”
:
return
“
&
amp
;”
;
case
“
\””
:
return
“
&
quot
;”
;
}
}
)
;
}
|
17.foo = foo||bar ,这行代码是什么意思?为什么要这样写?
答案:if(!foo) foo = bar; //如果foo存在,值不变,否则把bar的值赋给foo。
短路表达式:作为”&&”和”||”操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值。
18.看下列代码,将会输出什么?(变量声明提升)
1
2
3
4
5
6
|
var
foo
=
1
;
function
(
)
{
console
.
log
(
foo
)
;
var
foo
=
2
;
console
.
log
(
foo
)
;
}
|
答案:输出undefined 和 2。上面代码相当于:
1
2
3
4
5
6
7
|
var
foo
=
1
;
function
(
)
{
var
foo
;
console
.
log
(
foo
)
;
//undefined
foo
=
2
;
console
.
log
(
foo
)
;
// 2;
}
|
函数声明与变量声明会被JavaScript引擎隐式地提升到当前作用域的顶部,但是只提升名称不会提升赋值部分。
19.用js实现随机选取10–100之间的10个数字,存入一个数组,并排序。
1
2
3
4
5
6
7
8
9
|
var
iArray
=
[
]
;
funtion
getRandom
(
istart
,
iend
)
{
var
iChoice
=
istart
-
iend
+
1
;
return
Math
.
floor
(
Math
.
random
(
)
*
iChoice
+
istart
;
}
for
(
var
i
=
0
;
i
<
10
;
i
++
)
{
iArray
.
push
(
getRandom
(
10
,
100
)
)
;
}
iArray
.
sort
(
)
;
|
20.把两个数组合并,并删除第二个元素。
1
2
3
4
|
var
array1
=
[
'a'
,
'b'
,
'c'
]
;
var
bArray
=
[
'd'
,
'e'
,
'f'
]
;
var
cArray
=
array1
.
concat
(
bArray
)
;
cArray
.
splice
(
1
,
1
)
;
|
21.怎样添加、移除、移动、复制、创建和查找节点(原生JS,实在基础,没细写每一步)
1)创建新节点
createDocumentFragment() //创建一个DOM片段
createElement() //创建一个具体的元素
createTextNode() //创建一个文本节点
2)添加、移除、替换、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替换
insertBefore() //插入
3)查找
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值
getElementById() //通过元素Id,唯一性
22.有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}。
答案:
1
2
3
4
5
6
7
8
9
|
function
serilizeUrl
(
url
)
{
var
result
=
{
}
;
url
=
url
.
split
(
"?"
)
[
1
]
;
var
map
=
url
.
split
(
"&"
)
;
for
(
var
i
=
0
,
len
=
map
.
length
;
i
<
len
;
i
++
)
{
result
[
map
[
i
]
.
split
(
"="
)
[
0
]
]
=
map
[
i
]
.
split
(
"="
)
[
1
]
;
}
return
result
;
}
|
23.正则表达式构造函数var reg=new RegExp(“xxx”)与正则表达字面量var reg=//有什么不同?匹配邮箱的正则表达式?
答案:当使用RegExp()构造函数的时候,不仅需要转义引号(即\”表示”),并且还需要双反斜杠(即\\表示一个\)。使用正则表达字面量的效率更高。
邮箱的正则匹配:
1
|
var
regMail
=
/
^
(
[
a
-
zA
-
Z0
-
9_
-
]
)
+
@
(
[
a
-
zA
-
Z0
-
9_
-
]
)
+
(
(
.
[
a
-
zA
-
Z0
-
9_
-
]
{
2
,
3
}
)
{
1
,
2
}
)
$
/
;
|
24.看下面代码,给出输出结果。
1
2
3
4
5
|
for
(
var
i
=
1
;
i
<=
3
;
i
++
)
{
setTimeout
(
function
(
)
{
console
.
log
(
i
)
;
}
,
0
)
;
}
;
|
答案:4 4 4。
原因:Javascript事件处理器在线程空闲之前不会运行。追问,如何让上述代码输出1 2 3?
1
2
3
4
5
6
7
8
9
|
for
(
var
i
=
1
;
i
<=
3
;
i
++
)
{
setTimeout
(
(
function
(
a
)
{
//改成立即执行函数
console
.
log
(
a
)
;
}
)
(
i
)
,
0
)
;
}
;
1
//输出
2
3
|
25.写一个function,清除字符串前后的空格。(兼容所有浏览器)
使用自带接口trim(),考虑兼容性:
1
2
3
4
5
6
7
8
9
|
if
(
!
String
.
prototype
.
trim
)
{
String
.
prototype
.
trim
=
function
(
)
{
return
this
.
replace
(
/
^
\
s
+
/
,
""
)
.
replace
(
/
\
s
+
$
/
,
""
)
;
}
}
// test the function
var
str
=
" \t\n test string "
.
trim
(
)
;
alert
(
str
==
"test string"
)
;
// alerts "true"
|
26.Javascript中callee和caller的作用?
答案:
caller是返回一个对函数的引用,该函数调用了当前函数;
callee是返回正在被执行的function函数,也就是所指定的function对象的正文。
那么问题来了?如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,第n个月能繁殖成多少对兔子?(使用callee完成)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var
result
=
[
]
;
function
fn
(
n
)
{
//典型的斐波那契数列
if
(
n
==
1
)
{
return
1
;
}
else
if
(
n
==
2
)
{
return
1
;
}
else
{
if
(
result
[
n
]
)
{
return
result
[
n
]
;
}
else
{
//argument.callee()表示fn()
result
[
n
]
=
arguments
.
callee
(
n
-
1
)
+
arguments
.
callee
(
n
-
2
)
;
return
result
[
n
]
;
}
}
}
|
1.实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
// 方法一:
Object
.
prototype
.
clone
=
function
(
)
{
var
o
=
this
.
constructor
===
Array
?
[
]
:
{
}
;
for
(
var
e
in
this
)
{
o
[
e
]
=
typeof
this
[
e
]
===
"object"
?
this
[
e
]
.
clone
(
)
:
this
[
e
]
;
}
return
o
;
}
//方法二:
/**
* 克隆一个对象
* @param Obj
* @returns
*/
function
clone
(
Obj
)
{
var
buf
;
if
(
Obj
instanceof
Array
)
{
buf
=
[
]
;
//创建一个空的数组
var
i
=
Obj
.
length
;
while
(
i
--
)
{
buf
[
i
]
=
clone
(
Obj
[
i
]
)
;
}
return
buf
;
}
else
if
(
Obj
instanceof
Object
)
{
buf
=
{
}
;
//创建一个空对象
for
(
var
k
in
Obj
)
{
//为这个对象添加新的属性
buf
[
k
]
=
clone
(
Obj
[
k
]
)
;
}
return
buf
;
}
else
{
//普通变量直接赋值
return
Obj
;
}
}
|
2.如何消除一个数组里面重复的元素?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
var
arr
=
[
1
,
2
,
3
,
3
,
4
,
4
,
5
,
5
,
6
,
1
,
9
,
3
,
25
,
4
]
;
function
deRepeat
(
)
{
var
newArr
=
[
]
;
var
obj
=
{
}
;
var
index
=
0
;
var
l
=
arr
.
length
;
for
(
var
i
=
0
;
i
<
l
;
i
++
)
{
if
(
obj
[
arr
[
i
]
]
==
undefined
)
{
obj
[
arr
[
i
]
]
=
1
;
newArr
[
index
++
]
=
arr
[
i
]
;
}
else
if
(
obj
[
arr
[
i
]
]
==
1
)
continue
;
}
return
newArr
;
}
var
newArr2
=
deRepeat
(
arr
)
;
alert
(
newArr2
)
;
//输出1,2,3,4,5,6,9,25
|
3.小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。从这段描述可以得到以下对象:
1
2
3
4
5
6
7
8
|
function
Dog
(
)
{
this
.
wow
=
function
(
)
{
alert
(’
Wow’
)
;
}
this
.
yelp
=
function
(
)
{
this
.
wow
(
)
;
}
}
|
小芒和小贤一样,原来也是一条可爱的小狗,可是突然有一天疯了(MadDog),一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。请根据描述,按示例的形式用代码来实。(继承,原型,setInterval)
答案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function
MadDog
(
)
{
this
.
yelp
=
function
(
)
{
var
self
=
this
;
setInterval
(
function
(
)
{
self
.
wow
(
)
;
}
,
500
)
;
}
}
MadDog
.
prototype
=
new
Dog
(
)
;
//for test
var
dog
=
new
Dog
(
)
;
dog
.
yelp
(
)
;
var
madDog
=
new
MadDog
(
)
;
madDog
.
yelp
(
)
;
|
4.下面这个ul,如何点击每一列的时候alert其index?(闭包)
1
2
3
4
5
|
<ulid
=”test”
>
<li>
这是第一条
</li>
<li>
这是第二条
</li>
<li>
这是第三条
</li>
</ul>
|
答案:
1
2
3
4
5
6
7
8
|