前端笔试做题笔记----JavaScript篇

1、this五种情况
  1. 当在函数调用的时候指向widow
  2. 当方法调用的时候指向调用对象
  3. 当用apply和call上下文调用的时候指向传入的第一个参数
  4. 构造函数调用指向实例对象
  5. 箭头函数中使用this指向该函数所在的作用域指向的对象
2、({}+‘b‘>{}+‘a‘)返回值是() (考察 隐式类型转换)

因为有比较运算符,且两边的数据类型都不同,所以隐式类型转换
{}+‘b’:
toPrimitive({},String)这里为什么是String,而不是Number。我是通过 {} + ‘b’ === “[object Object]b”//true验证的。
(ps:个人猜测因为都有字符串且是 + ,所以这里是转成String的原始值)
{}.valueOf();//{}空对象
{}.toString();//“[object,object]”
toPrimitive(“[object,object]”,String)

所以{}隐式类型转换的原始值为String(“[object,object]”);//“[object,object]”

所以:{}+‘b’ ==>“[object,object]”+‘b’

{}+'a’同理

因此最后{}+‘b’>{}+‘a’ ==> “[object,object]b” > “[object,object]a”;

为了验证是这样:console.log({}+‘2’>{}+‘3’);//false;

3 、 js 函数定义方式
  1. 函数声明语法定义:function sum(num1,num2){return num1+num2}
  2. 函数表达式定义函数:
    1. var sum = function(num1,num2){return num1+num2};
    2. var sum = new Function("num1","num2","return num1+num2");Function构造函数可以接受任意数量的参数,但最后一个参数始终被看成函数体,注意函数表达式定义函数的方法与声明其他变量时一样需要加分号。
4、 js 单线程机制相关题目

var声明的变量i不具有块级作用域

  1. 异步任务–点击事件
    在这里插入图片描述

这里考的是JS的运行机制! 事件(click,focus等等),定时器(setTimeout和setInterval),ajax,都是会触发异步,属于异步任务;js是单线程的,一个时间点只能做一件事,优先处理同步任务; 按照代码从上往下执行,遇到异步,就挂起,放到异步任务里,继续执行同步任务,只有同步任务执行完了,才去看看有没有异步任务,然后再按照顺序执行! 这里for循环是同步任务,onclick是异步任务,所以等for循环执行完了,i变成4了,注意:这里因为i是全局变量,最后一个i++,使得i为4(后面的onclick函数,最后在循环外面执行,不受i<length限制); 所以for循环每执行一次,onclick事件函数都会被挂起一次,共4次; for循环结束后,点击事件 触发了4个onclick函数,接着输出4个4!

  1. 异步任务–定时器 (let和var)
    在这里插入图片描述

第一个:let将i绑定到for循环快中,事实上它将其重新绑定到循环体的每一次迭代中,确保上一次迭代结束的值重新被赋值。setTimeout里面的function()属于一个新的域,通过 var 定义的变量是无法传入到这个函数执行域中的,通过使用 let 来声明块变量,这时候变量就能作用于这个块,所以 function就能使用 i 这个变量了;输出为0,1.
第二个:settimeout是异步执行,1s后往异步任务队列里面添加一个任务,只有同步的全部执行完,才会执行异步任务队列里的任务,当主线执行完成后,i是2,所以此时再去执行任务队列里的任务时,所以输出两次2.

5、变量提升和函数提升
  1. 函数声明提升优先级高于变量声明提升

当变量和函数同名时,优先留下函数的值,即函数的优先级更高

  1. 提升就是声明(变量/函数)提至当前作用域的最顶部,赋值语句留在原地
//原来的代码
var a = 2;
function fn(){
   
        b();
        return ;
        var a = 1;
        function b(){
   
            console.log(a);
        }
}
fn();
 
//实际上的代码
var a = 2;
function fn(){
   
    function b(){
   
      console.log(a);
    }
    var a //变量声明提升,默认赋值为undefined
    b(); //执行函数b,在当前作用域找到a,值为undefined
    return;//return后面的语句不再执行,a没有被赋值为1
    a = 1; //在原来的位置才会赋值,但不会执行到这里
}
fn();
  1. 函数创建有3个形式,函数声明和函数表达式( 以及 new Function构造函数),只有函数声明才有函数提升
//函数声明
  function f1(){
   
    console.log('我是函数声明')
  }
  //函数表达式
  var f2 = function () {
   
    console.log('我是函数表达式')
  }
 
函数发生提升后
// 函数声明--提升
function f1() {
   
  console.log('我是函数声明')
}
var f2;
f1() //'我是函数声明'
f2() //error:f2 is not a function
// 函数表达式
f2 = function() {
   
  console.log('我是函数表达式')
}
6、 JavaScript 常见事件
  1. 鼠标事件
    在这里插入图片描述
  2. 键盘事件
    在这里插入图片描述
  3. 焦点事件
    在这里插入图片描述
  4. 滚轮事件
    在这里插入图片描述
7、 NOSCRIPT标签的作用

NOSCRIPT标签用来定义在脚本未被执行时的替代内容。也可以用在检测浏览器是否支持脚本,若不支持脚本则可以显示NOSCRIPT标签里的innerText
noscript:用以在不支持js的浏览器中显示替代的内容,这个元素可以包含能够出现在文档中任何html元素,script元素除外。包含在noscript元素的内容只有在下列情况下才会显示出来

  1. 浏览器不支持脚本
  2. 浏览器支持脚本,但脚本被禁用
8、 JavaScript 数据类型那些事
  1. undefined和null与任何有意义的值比较返回的都是false,但是null与undefined之间互相比较返回的是true。
    在这里插入图片描述
  2. Symbol类型
    1. Symbol为ES6新增的基本数据类型,表示独一无二的值。
    2. Symbol()函数会返回symbol类型的值,每个从Symbol()返回的symbol值都是唯一的。
    3. Symbol.for() 返回由给定的 key 找到的 symbol,否则就是返回新创建的 symbol
    4. 用Symbol来创建Symbol对象时,不使用new运算符
  3. NaN==NaN为假,NaN是一个不确定数,所以NaN不能等于NaN
  4. null instanceof Object为假,在js中 typeof null会返回object,这并不意味着null是object类型,只是遗留错误。null不是object创建的实例对象
9、立即执行函数

在这里插入图片描述
答案:E

function() {o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东篱_Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值