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会优先选择将字符串转成数字==
Cjavascript规范中提到, 要比较相等性之前,不能将nullundefined转换成其他任何值,并且规定nullundefined是相等的。

nullundefined都代表着无效的值。
DisNaN() 函数用于检查其参数是否是非数字值。

如果参数值为 NaN 或字符串、对象、undefined等非数字值则返回 true, 否则返回 false
暑期编程PK赛 得CSDN机械键盘等精美礼品!

以上是关于Javascript专项练习_01——预解析分析_歧义混淆_闭包锁定_类型检测_四舍五入_自执行_箭头函数_地址(深浅)引用的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript专项练习1 [牛客]

函数_预解析_对象

枚举专项练习_Uva725(Division)_Uva11059(Maximun Product)

理解Javascript_01_理解内存分配

理解Javascript_01_理解内存分配

阿里云ACP考试认证ECS专项练习