Javascript专项练习_01——预解析分析_歧义混淆_闭包锁定_类型检测_四舍五入_自执行_箭头函数_地址(深浅)引用
Posted 勇敢*牛牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript专项练习_01——预解析分析_歧义混淆_闭包锁定_类型检测_四舍五入_自执行_箭头函数_地址(深浅)引用相关的知识,希望对你有一定的参考价值。
JavaScript中定义var a=“40”,var b=7,则执行a%b会得到?
var a="40"
var b = 7
console.log(a%b);//5
执行以下代码,输出的a值为()
if(! "a" in window)
var a = 1;
alert(a);//undefined
执行以下程序,输出结果为()
var a =[1,2,3];
var b = a.slice();
b.push(4);
console.log(a)//[1, 2, 3]
console.log(b);//[1, 2, 3, 4]
假设 output 是一个函数,用来输出一行文本。下面这行语句输出结果是什么?
output(typeof (function() output(“Hello World!”))());
或者:
alert(typeof((function()
alert('Hello World!');
)()
));
1.先立即执行匿名函数,输出Hello World!
2.函数执行后无返回值,则输出未定义
函数 cals(7) 的返回是什么?
var x=10;
function cals(myNum)
return x+myNum;
下列关于 js 函数定义方式的描述正确的是
function add(a,b)return a+b;
函数表达式
var add=new Function(‘a’,’b’,’return a+b’)
函数表达式
function add(a,b)return a+b;
函数声明
var add=function(a,b)return a+b;
函数声明
var add=new Function(‘a’,’b’,’return a+b’);
函数声明
请问以下JS代码的输出结果以及变量i的值是?
var i = 100;
function foo()
bbb: try
console.log("position1");
return i++;
finally
break bbb;
console.log("position2");
return i;
foo();
注意break除了用于中断循环以及switch语句,还可以用于标签化语句的中断,这里的标签化语句即在一般语句前面多加了xxx:的标签,如果在try或try except块中使用了return,那么这个break将发生于最后一行语句之后,但是却是在return语句之前。所以这里的break是去中断bbb里面的语句,执行完所有的操作后才阻止了return,因此i是增加了,然后继续执行剩下的代码,在输出position2后才返回i变量。
关于try…catch…finally的用法😊
1、try catch 还有finally的基本概念
- 1)try块一共有三个关键字try catch 还有finally;
- 2)finally 语句无论 try 和 catch 执行结果如何都会执行;(本题考到的知识点)
- 3)catch是捕获到 try语句块里的错误才会执行;
注意: catch 和 finally 语句都是可选的,但你在使用 try 语句时必须至少使用一个(也就是try必须搭配catch或者finally)。
2、try catch 还有finally代码块中 有return时 的执行情况(本题考到的知识点)
例一:
如果try语句没有使用finally,则返回try语句中return的东西,
函数try…catch语句之外的return 就不执行了
function testFinally()
var num = 10;
try
return num + 1;//return这里的值11
catch (err)
console.log(err)
return num + 5; //无效,没执行到这,try...catch执行之后就跳出了
//除非try...catch...finaly语句中没有return
console.log(testFinally());//11
例二:
如果try语句后面有finally,try中的return不会跳出函数,因为一定要进入finally语句
函数try…finally语句之外的return 就不执行了
function testFinally()
var num = 10;
try
return num += 1; //return右边的语句正常执行,计算得num=11
finally //有finally,try中的return不会跳出函数,因为一定要进入finally语句
return num + 20; //11+20=31
return num + 5; //无效,没执行到这,try...finally执行之后就跳出了
console.log(testFinally());// 31
例三:(可看完后面的break知识点,再来看这个例子)
如果try语句后面有finally,try中就算有break用来跳出语句块,也不管用
只要有finally,不管try和catch语句中执行什么,一定会进入finally语句
function testFinally()
var num = 10;
aaa: try
break aaa; //有break按理说应该要跳出 try...finally... 这个语句块了
//但是不管用,因为后面有finally,一定要进入finally语句
finally
return num + 20; //10+20=30
return num;//失效,没执行到这
console.log(testFinally());// 30
重点记住:try…catch…finally语句中,只要有finally存在,只要有finally,不管try和catch语句中执行什么,一定会进入finally语句
var i = 100;`在这里插入代码片`
function foo() //bbb 是 try... finally...这个代码块
bbb: try //break语句的标签引用,用于跳出 bbb标签 代码块
console.log("position1");//打印position1
return i++; //继续执行return右边的代码,此时i++为100,i为101
finally //只要有finally,不管try语句里写啥(return,break之类的失效),都会执行finally语句
break bbb; //跳出bbb标签代码块
//跳出try...finally后,因为finally中没有return,故可执行后续代码
//如果finally中有return,则无法执行后续代码了
console.log("position2");//打印position2
return i;//返回i,i=101
下列哪行代码正确的引入了myScript.js?
<script href="myScript.js">
<script name="myScript.js">
<script src="myScript.js">
<script root="myScript.js">
执行以下程序,输出结果为()
var a = 100;
function a()
var a = 200;
console.log(a);
a();
JavaScript所有变量在使用之前必须做声明吗?
<script>
function a()
for(i=0;i<20;i++)
// 没有 var i
return i;
document.writeln(a());//A如果是局部变量无需声明,也可以使用
</script>
执行以下程序,输出结果为()
var a = 100;
function a()
var a = 200;
console.log(a);
a();
在预解析下,函数和变量都会发生提升,且函数提升在变量提升之前,故在全局作用域下,a首先被定义为函数变量,接着又被覆盖为一个数值型,然后再调用函数a,显然会抛出异常,原因是a已经不再是函数。在函数内部,还存在着局部变量a,但它对函数外部的变量不会产生影响。
本题知识点
JavaScript的基本数据类型有哪几种?
如何遍历下面的 my_data 对象?
for(var key in my_data)
foreach(my_data as key=>value)
for(var i=0;i<my_data.length;i++)
请问以下JS代码在Node环境下的输出顺序是?
Promise.resolve()
.then(() =>
console.log('p1');
)
.then(() =>
console.log('p2');
)
process.nextTick(() =>
console.log('n1');
process.nextTick(() =>
console.log('n2');
)
)
注意虽然两者都属于微任务,但是只要它不是process.nextTick派发的,全部都要排队在process.nextTick后面执行。
Node 中的“微任务(microtasks)其实是一个统称,包含了两部分:
process.nextTick() 注册的回调 (nextTick task queue)
promise.then() 注册的回调 (promise task queue)
Node 在执行微任务时, 会优先执行 nextTick task queue 中的任务,执行完之后会接着执行 promise task queue 中的任务。所以如果 process.nextTick 的回调与 promise.then 的回调都处于主线程或事件循环中的同一阶段, process.nextTick 的回调要优先于 promise.then 的回调执行。
void();
上面表达式的结果是:
typeof 1; //'number'
typeof (1);//'number'
typeof (); //SyntaxError 语法错误
void 0; //undefined
void (0);//undefined
void (); //SyntaxError 语法错误
void是一元运算符,它出现在操作数之前,操作数可以是任意类型,操作数会照常计算,但忽略计算结果并返回undefined。由于void会忽略操作数的值,因此在操作数具有副作用的时候使用void来让程序更具语义
console.log(void 0); // undefined
console.log(void(0)); // undefined
下面方式在同一个窗口下能够检测一个js对象是数组类型
Array.isArray()
instanceof
Object.prototype.toString.call()
Array 为 js 的原生对象,它有一个静态方法:Array.isArray(),能判断参数是否为数组
instanceof 运算符返回一个布尔值,表示对象是否为某个构造函数的实例
var a = [1,2,3]
- console.log(a instanceof Array);//true
- typeof 能判断类型有:number、string、boolean、symbol、undefined、function; object、array、null 的变量都返回 object
- Object.prototype.toString() 为 Object 对象的实例方法,默认情况下(即不重写该方法),返回参数的类型字符串。
“+new Array(017)” 这段代码输出为?()
"+new Array(017)"//NaN
+作为一元运算符时,会将参数转换为数字返回
在JavaScript中,下列不属于数组方法的是()
concat()
sort()
reverse()
length()//属性
下面代码实现的是什么?
var str = "stiabsstringapbs";
var obj = ;
for (var i = 0; i < str.length; i++)
var key = str[i];
if (!obj[key])
obj[key] = 1;
else
obj[key]++;
var max = -1;
var max_key = "";
var key;
for (key in obj)
if (max < obj[key])
max = obj[key];
max_key = key;
alert("max:"+max+" max_key:"+max_key);
A:obj是用来统计字符数量的
B:代码所实现的功能是:统计字符串中,所有字符的数量
C:max表示最大字符,key表示字符
D:代码实现功能是:判断一个字符串中出现次数最多的字符,统计这个次数
var str = "stiabsstringapbs"; //定义字符串
var obj = ; //定义对象
for (var i = 0; i < str.length; i++) //遍历字符串
var key = str[i]; //存储字符
if (!obj[key]) //若对象中不存在该key,初始化为1
obj[key] = 1;
else //若对象中存在该key,则数值加1
obj[key]++;
/*第一个for循环结束得到每个字符数量的对象,大概下面这鸟样
obj=
s:4,
t:2,
i:2,
...
*/
var max = -1; //初始化最大数量,最大数量字符
var max_key = "";
var key;
for (key in obj) //遍历obj对象,获得字符最大数量及对应字符
if (max < obj[key])
max = obj[key];
max_key = key;
alert("max:"+max+" max_key:"+max_key);
请问以下JS代码最终输出的结果和num值分别是多少?
var test = (function()
var num = 0
return () =>
return num++
())
for (var i = 0; i < 20; i++)
test()
console.log(test());
以下代码执行后,num的值是:
var test = (function() //test是一个自执行函数,自执行函数里返回了一个箭头函数
var num = 0 //故test()的时候是调用执行了箭头函数
return () =>
return num++
())
for (var i = 0; i < 20; i++)
test() //调用一次test()就执行一次箭头函数,for循环里调用了20次
//for循环第一次test()返回了0,第20次返回了19
console.log(test()); //这里又调用了一次test(),此时test()返回了20,
//而num的值比test()的返回值num++ 大1,故num为21
//解析——1
var test = ()
// 可以将上面的代码拆分开分析一下,下面是()里的代码,外面的()只是为了符合语法。
// 下面是一个自执行函数,一开始它自己调用自己一次,将箭头函数返回给 var test。
function()
var num = 0
return function()
return num++
()
// 那 var test 现在就是一个函数了。
// 在返回箭头函数的时候,函数里引用了第6行的num,所以该函数不进行销毁。
// 如果销毁了,那么test()的时候,num就不翼而飞,找不到了。
// 现在 test就相当于
var test = function()
return num++;
for (var i = 0; i < 20; i++)
test()
// 这里就相当于调用了20次的test,test存储的num也就变成了20
console.log(test());
// 最后又输出了一次,num+1,变成了21。
考点是闭包 + 后自加。 test 一直持有自执行函数的环境( num 的值),当使用 test() 时执行内部函数( num++ )。 因此,在 for 循环中执行20次循环得到的值为19( num的操作为后++,即此时只是获取变量 num 的值,再进行 +1 操作)。同理在 console.log 执行时输出值为20,操作结束后值为 num 执行 +1 操作,此时 num 值为 21。
如果修改obj里面的name属性时会发生什么?
let obj = name: '222';
let _name = obj.name;
Object.defineProperty(obj, 'name',
get()
return _name;
,
set(newVal)
console.log(newVal, _name);//打印11和222
_name = newVal;
)
obj.name = '11';
这里通过对象的原生方法去监听obj的name属性,主要是为了到达修改name属性时,同时打印出新值和旧值。
以下代码执行后,result 的值是:
var result = Math.round(11.5) + Math.round(-11.5);
这里是引用
Math.round(x)
如果参数的小数部分大于 0.5,则舍入到下一个绝对值更大的整数;
如果参数的小数部分小于 0.5,则舍入到下一个绝对值更小的整数;
如果参数的小数部分恰好等于0.5,则舍入到下一个在正无穷(+∞)方向上的整数。注意,与很多其他语言中的round()函数不同,Math.round()并不总是舍入到远离0的方向(尤其是在负数的小数部分恰好等于0.5的情况下)
以下哪个语句打印出来的结果是false?
- alert(3==true)//x
- alert(2==“2”)
- alert(null == undefined)
- alert(isNaN(“true”))
1 == true // 布尔值会转成number true即为1 所以结果是true
2 == true // 布尔值会转成number true即为1 所以结果是false
3 == true // 布尔值会转成number true即为1 所以结果是false
1 == false // 布尔值会转成number false即为0 所以结果是false
0 == false // 布尔值会转成number false即为0 所以结果是true
B、数字字符串2会转换成数字2在和数字2进行比较 。
== js会优先选择将字符串转成数字==
C、javascript规范中提到, 要比较相等性之前,不能将null和undefined转换成其他任何值,并且规定null和undefined是相等的。
null和undefined都代表着无效的值。
D、
isNaN() 函数用于检查其参数是否是非数字值。
如果参数值为 NaN 或字符串、对象、undefined等非数字值则返回 true, 否则返回 false。
暑期编程PK赛
得CSDN机械键盘等精美礼品!
以上是关于Javascript专项练习_01——预解析分析_歧义混淆_闭包锁定_类型检测_四舍五入_自执行_箭头函数_地址(深浅)引用的主要内容,如果未能解决你的问题,请参考以下文章