1、JavaScript程序中,alert(undefined == null)的输出结果是 ture;
解析:undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true。
==仅判断值是否相同,undefined值和null是相同的,故true
===在判断值是否相同的同时还判断类型是否相同,undefined类型为undefined,null类型为object,因此为false
2、javascript常见事件的触发情况
- onBlur:当失去输入焦点后产生该事件
- onFocus:当输入获得焦点后,产生该文件
- onchange:当文字值改变时,产生该事件
- onselect:当文字加亮后,产生该事件
- onClick:当组件被点击时产生的事件
3,、下面这段javascript代码,
var msg='hello';
for (var i=0; i<10; i++)
{
var msg='hello'+i*2+i;
}
alert(msg);
最后一句alert的输出结果是 hello189
解析:易错答案(hello)javascript只有函数域,没有块作用域的概念,所以在同一个作用域中同一个变量声明多次还是第一次声明那个!
4、有如下代码:
var name="World!";
(function(){
var name;
if(typeof name=== 'undefined'){
name='Jack';
console.log('Goodbye'+name);
}
else
{
console.log('hello'+name);
}
}
)();
请问执行后弹出的值是:Goodbye Jack
解析:当函数内部变量与全局变量同名是,全局变量会被覆盖,因为JS是单线程执行var name 当前没有复制,所以类型为undefined;
变量声明提升
JS码分为解析阶段和执行阶段。
在解析阶段会找到所有声明,并会与各自执行环境关联。只有声明操作会被提升,赋值和逻辑操作会被留在原地等待代码执行。
如对于 var a=2; 解析器会把它当成声明操作(var a)和赋值操作(a=2)两部分。声明操作会被提升到它所在执行环境的顶部,并赋值 undefined而赋值操作则会原地待命。 原代码相当于:
var name="world";
(function(){
var name; //JS无块级作用域,所以变量声明提升到此处
if(typeof name==="undefined"){ //进入if控制语句
name="Jack";
console.log("Goodbye"+name); //执行该语句
}else{
console.log("Hello"+name);
}
})();
//所以答案为 Goodbye Jack
5、如下代码输出的结果是什么:
1 2 3 4 |
|
1 |
|
做加法时要注意双引号,当使用双引号时,JavaScript认为是字符串,字符串相加等于字符串合并。
因此,这里相当于字符串的合并,即为122.
1 |
|
第一个+"2"中的加号是一元加操作符,+"2"会变成数值2,因此1+ +"2"相当于1+2=3.
然后和后面的字符串“2”相合并,变成了字符串"32".
1 |
|
"A"-"B"的运算中,需要先把"A"和"B"用Number函数转换为数值,其结果为NaN,在减法操作中,如果有一个是NaN,则结果是NaN,因此"A"-"B"结果为NaN。
然后和"2"进行字符串合并,变成了NaN2.
1 |
|
根据上题所述,"A"-"B"结果为NaN,然后和数值2进行加法操作,在加法操作中,如果有一个操作数是NaN,则结果为NaN。
6、filter的两种使用方法
- 在模板中使用filter
我们可以直接在{{}}中使用filter,跟在表达式后面用 | 分割,语法如下:
{{ expression | filter }}
也可以多个filter连用,上一个filter的输出将作为下一个filter的输入
{{ expression | filter1 | filter2 | ... }}
filter可以接收参数,参数用 : 进行分割,如下:
{{ expression | filter:argument1:argument2:... }}
除了对{{}}中的数据进行格式化,我们还可以在指令中使用filter,例如先对数组array进行过滤处理,然后再循环输出:
<span ng-repeat="a in array | filter ">
- 在controller和service中使用filter
我们的js代码中也可以使用过滤器,方式就是我们熟悉的依赖注入,例如我要在controller中使用currency过滤器,只需 将它注入到该controller中即可,代码如下:
app.controller('testC',function($scope,currencyFilter){
$scope.num = currencyFilter(123534);
}
在模板中使用{{num}}就可以直接输出 $123,534.00了!在服务中使用filter也是同样的道理。
ng提供了一个$filter服务可以来调用所需的filter,你只需注入一个$filter就够了,使用方法如下:
app.controller('testC',function($scope,$filter){
$scope.num = $filter('currency')(123534);
$scope.date = $filter('date')(new Date());
}
可以达到同样的效果。好处是你可以方便使用不同的filter了。
7、假设有如下代码,那么a(10)的返回结果是 (5)
function a(a)
{
a^=(1<<4)-1;
return a;
}
解析:
1<<4 左移相当于1*2^4=16
a^=16-1=15
a=a^15=10^15
^ 异或运算:
10的二进制00001010
15的二进制00001111
========>00000101 转成十进制:5
(按位异或运算,同为1或同为0取0,不同取1)
8、JS中,可以将对象分为“内部对象”、“宿主对象”和“自定义对象”三种。
- 内部对象
js中的内部对象包括Array、Boolean、Date、Function、Global、Math、Number、Object、RegExp、String以及各种错误类对象,包括Error、EvalError、RangeError、ReferenceError、SyntaxError和TypeError。
其中Global和Math这两个对象又被称为“内置对象”,这两个对象在脚本程序初始化时被创建,不必实例化这两个对象。
- 宿主对象
宿主对象就是执行JS脚本的环境提供的对象。对于嵌入到网页中的JS来说,其宿主对象就是浏览器提供的对象,所以又称为浏览器对象,如IE、Firefox等浏览器提供的对象。不同的浏览器提供的宿主对象可能不同,即使提供的对象相同,其实现方式也大相径庭!这会带来浏览器兼容问题,增加开发难度。
浏览器对象有很多,如Window和Documen,Element,form,image,等等。
- 自定义对象
顾名思义,就是开发人员自己定义的对象。JS允许使用自定义对象,使JS应用及功能得到扩充
9、match是支持正则表达式的String对象的方法
今天在牛客网上刷题时做的笔记,方便自己复习。