1.函数部分
例题1:编写一个将十六进制值转换为颜色的函数,以蓝色为例,#0000FF 应被表示成
rgb(0,0,255)的形式。然后将函数命名为 getRGB(),并用以下代码进行测试。提示:
可以将字符串视为数组,这个数组的元素为字符。
function getRGB(x){
//拿到color的十六进制表示
var color = x;
//分成四部分,除了第一部分是‘#’,后面每一部分两位
var one = '', two = '', three = '';
for(var i = 1;i < 7;i++){
if(i > 0 && i < 3){
one+=x[i];
}
else if(i > 2 && i < 5){
two+=x[i];
}
else if(i > 4 && i < 7){
three+=x[i];
}
}
//将每一个部分的十六进制表示转换成十进制表示
//拼接成最终结果
console.log('rgb('+parseInt(one,16)+','+parseInt(two,16)+','+parseInt(three,16)+')');
}
getRGB('#0000ff');
例题2:如果在控制台中执行以下各行,分别会输出什么内容?
parseInt(1e1);
parseInt(‘1e1’);
parseFloat(‘1e1’);
>parseInt(1e1);
10
>parseInt('1e1');
1
>parseFloat('1e1');
10
例题3:关于JavaScript的提升(hoisting)概念,下面的运行结果你一定会大跌眼镜
var a = 123;
function f() {
alert(a);
var a = 1;
alert(a);
}
f();
您可能会想当然地认为 alert()第一次显示的是 123(也就是全局变量 a 的值),而
第二次显示的是 1(即局部变量 a)。但事实并非如此,第一个 alert()实际上显示的是
undefined,这是因为函数域始终优先于全局域,所以局部变量 a 会覆盖掉所有与它同名
的全局变量,尽管在 alert()第一次被调用时,a 还没有被正式定义(即该值为
undefined),但该变量本身已经存在于本地空间了。这种特殊的现象叫做提升(hoisting)。
也就是说,当 JavaScript 执行过程进入新的函数时,这个函数内被声明的所有变量都
会被移动(或者说提升)到函数最开始的地方。这个概念很重要,必须牢记。另外需要注
意的是,被提升的只有变量的声明,这意味着,只有函数体内声明的这些变量在该函数执
行开始时就存在,而与之相关的赋值操作并不会被提升,它还在其原来的位置上。譬如在
前面的例子中,局部变量本身被提升到了函数开始处,但并没有在开始处就被赋值为 1。
那个例子可以被等价地改写为:
var a = 123;
function f() {
var a; // same as: var a = undefined;
alert(a); // undefined
a = 1;
alert(a); // 1
}
当然,我们也可以采用在最佳实践中提到过的单一 var 模式。在这个例子中,我们可
以手动提升变量声明的位置,这样一来代码就不会被 JavaScript 的提升行为所混淆了。
2.对象部分
1.this默认指向的是全局对象window。其实指针在任何的编程语言中都是存在的,只是有些语言帮我们来自动管理指针,如:java,JavaScript等,这对于开发者来说很方便,可以提高开发速度。如果你去深入理解一门语言的底层时往往可以看到指针的存在。
2.推断对象类型
var toStr = Object.prototype.toString;
(function () {
return toStr.call(arguments);
}());
/*输出"[object Arguments]"*/
var toStr = Object.prototype.toString;
toStr.call(document.body);
/*输出"[object HTMLBodyElement]"*/