您真的了解javaScript?(3)
点击下面链接,来测测您的javaScript水平吧。
JavaScript Puzzlers!
21.
function f() {} var a = f.prototype, b = Object.getPrototypeOf(f); a === b; //false
f.prototype输出Object {constructor: function},是f的实例对象的原型(实例对象就是那些通过new f()创造的对象),用来保存实例的共享方法,有一个指针constructor来指向构造函数。
而Object.getPrototypeOf(f)用于读取对象的`__proto__`属性,打印后输出function () { [native code] },是f对象的原型。
大白话来说,如果说实例对象new f()是儿子,f.prototype是爸爸,那么这里getPrototypeOf获取的就是爷爷(的方法,如果有)。通过原型链,找不到爷爷就找祖爷爷...
22.
function foo() { } var oldName = foo.name; foo.name = "bar"; [oldName, foo.name]
函数的name属性,返回该函数的函数名,这个属性是一个只读属性,不能更改,就算赋值给了一个变量叫newFoo,这个函数的名字还是foo。当然,硬要改的话,用 Object.defineProperty()这个办法。
23.
"1 2 3".replace(/\d/g, parseInt)
stringObject.replace(regexp/substr,replacement)方法的replacement参数可以是字符串,也可以是函数。当它是函数时,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。所以parseInt被调用时候的参数,实际是这样:[1, 0]
, [2, 2]
, [3, 4]。
24.
function f() {} var parent = Object.getPrototypeOf(f); f.name // "f" parent.name // "" typeof eval(f.name) // "function" typeof eval(parent.name) // "undefined"
匿名函数赋值给变量parent,匿名函数name属性依旧是未定义,答案说会抛出error,然而我的chrome浏览器并不会...
25.
var lowerCaseOnly = /^[a-z]+$/; [lowerCaseOnly.test(null), lowerCaseOnly.test()]
RegExpObject.test(string)方法,用于检测一个字符串是否匹配某个模式,返回一个布尔值。
/^[a-z]+$/ 这个正则表达式是以小写字母开头和结尾,表示整串都要小写。
test()会把参数转为字符串。参数null和undefined都是小写,于是匹配为true。
26.
var a = {class: "Animal", name: 'Fido'};
a.class
class是一个关键字,不要用关键字保留字这些东西来命名自定义属性或者变量。非要用的话,可以这样访问:a.['class']
27.
var a = new Date("epoch")
Date()参数形式有5种:
1)new Date("month dd,yyyy hh:mm:ss");
2)new Date("month dd,yyyy");
3)new Date(yyyy,mth,dd,hh,mm,ss);
4)new Date(yyyy,mth,dd);
5)new Date(ms);
"epoch"不是一个符合规范的参数。但Date()并不会因此抛出异常,无论如何它会告诉你,这是一个invalid date。
28.
var a = Function.length, b = new Function().length a === b
false。Function.length == 1,而一个function(Function 的实例)的 length
属性就是函数签名的参数个数, 所以 b == 0.
29.
var a = Date(0); var b = new Date(0); var c = new Date(); [a === b, b === c, a === c] //false, false, false
Date(0) 函数返回的是一个当前时间的字符串"string"。作为构造函数时,返回的类型是"object"。有参数0返回1970.1.1,无参数则返回当前时间。
30.
function captureOne(re, str) { var match = re.exec(str); return match && match[1]; } var numRe = /num=(\d+)/ig, wordRe = /word=(\w+)/i, a1 = captureOne(numRe, "num=1"), a2 = captureOne(wordRe, "word=1"), a3 = captureOne(numRe, "NUM=2"), a4 = captureOne(wordRe, "WORD=2"); [a1 === a2, a3 === a4]
exec() 方法用于检索字符串中的正则表达式的匹配。如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。
正则表达式 /g表示全局匹配,表示可以多次执行exec()方法。
当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
31
var a = new Date("2014-03-19"), b = new Date(2014, 03, 19); [a.getDay() === b.getDay(), a.getMonth() === b.getMonth()]
1. The getMonth method returns an integer between 0 (January) and 11 (December). 从Date对象返回月份(0~11)
2. 当Date()参数是字符串,JavaScript 使用以下规则来分析日期字符串:
1).它首先尝试使用 ISO 日期格式 来分析日期字符串: YYYY-MM-DDTHH:mm:ss.sssZ
2).如果日期字符串未采用 ISO 格式,则 JavaScript 会尝试使用其他 其他日期格式 来分析日期。
所以Date()有两种参数,当参数为第一种: Date(year, month, date[, hours[, minutes[, seconds[,ms]]]]),b = new Date(2014, 03, 19),b实际上是2014-4-19。所以getDay()会得到不同的结果。
32.
if ('http://giftwrapped.com/picture.jpg'.match('.gif')) { 'a gif file' } else { 'not a gif file' }
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。当参数是一个字符串或一个数字,它会使用new RegExp(obj)来隐式转换成一个 RegExp
。
这样,'.gif'匹配 '任意字符gif'。所以这题返回的是 a gif file
所以,当要匹配gif文件时,可以这样写:/^.*\.(gif)$/i;