您真的了解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;

posted @ 2017-04-24 14:06  kiera  阅读(195)  评论(0编辑  收藏  举报