JavaScript逐点突破第4篇之语言基础,外加3道题目练习,字节跳动前端面试题解析

本文提供了一份全面的前端学习资料,包括从零基础到进阶课程,覆盖95%前端知识点,旨在帮助程序员高效自学。作者分享了JavaScript严格模式、变量声明技巧,强调系统学习的重要性,以及如何准备面试。同时鼓励加入技术交流社区,共同成长。
摘要由CSDN通过智能技术生成

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

多行注释以一个斜杠和一个星号(/)开头,以它们的反向组合(/)结尾,如:

/* 这是多行

注释 */

严格模式

ECMAScript 5增加了严格模式(strict mode)的概念。严格模式是一种不同的 JavaScript 解析和执行模型,ECMAScript 3 的一些不规范写法在这种模式下会被处理,对于不安全的活动将抛出错误。要对整个脚本启用严格模式,在脚本开头加上这一行:

‘use strict’

虽然看起来像个没有赋值给任何变量的字符串,但它其实是一个预处理指令。任何支持 JavaScript 的引擎看到它都会切换到严格模式。选择这种语法形式的目的是不破坏 ECMAScript 3语法。

也可以单独指定一个函数在严格模式下执行,只要把这个预处理指令放到函数体开头即可:

function doSomething() {

‘use strict’

// 函数体

}

严格模式会影响 JavaScript 执行的很多方面,所有现代浏览器都支持严格模式。

语句

ECMAScript中的语句以分号结尾。省略分号意味着由解析器确定语句在哪里结尾,如下面的例子所示:

var sum = a + b // 没有分号也有效,但不推荐

var diff = a - b // 加分号有效,推荐

即使语句末尾的分号不是必需的,也应该加上。记着加分号有助于防止省略造成的问题,比如可以避免输入内容不完整。此外,加分号也便于开发者通过删除空行来压缩代码(如果没有结尾的分号,只删除空行,则会导致语法错误)。加分号也有助于在某些情况下提升性能,因为解析器会尝试在合适的位置补上分号以纠正语法错误。

关键字与保留字

ECMA-262描述了一组保留的关键字,这些关键字有特殊用途,比如表示控制语句的开始和结束,或者执行特定的操作。按照规定,保留的关键字不能用作标识符或属性名。

break do in typeof

case else instanceof var

catch export new void

class extends return while

const finally super with

continue for switch yield

debugger function this

default if throw

delete import try

规范中也描述了一组未来的保留字,同样不能用作标识符或属性名。虽然保留字在语言中没有特定用途,但它们是保留给将来做关键字用的。以下是 ECMA-262第 6 版为将来保留的所有词汇。

始终保留:

enum

严格模式下保留

implements package public

interface protected static

let private

模块代码中保留

await

声明变量并赋值


在 JavaScript 中,有 3 个关键字可以声明变量: varconstlet。其中,varECMAScript的所有版本中都可以使用,而 constlet 只能在ECMAScript 6(将在后面学到) 及更晚的版本中使用。

var 关键字

要定义变量,可以使用 var关键字,后跟变量名:

var xhsRookies

这行代码定义了一个名为 xhsRookies的变量,可以用它保存任何类型的值。ECMAScript实现变量初始化,因此可以同时定义变量并设置它的值:

var xhsRookies = ‘hi’

xhsRookies被定义为一个保存字符串值hi的变量。像这样初始化变量不会将它标识为字符串类型,只是一个简单的赋值而已。随后,不仅可以改变保存的值,也可以改变值的类型:

var xhsRookies = ‘hi’

xhsRookies = 100 // 合法,但不推荐

在这个例子中,变量 xhsRookies首先被定义为一个保存字符串值hi的变量,然后又被重写为保存了数值 100 。虽然不推荐改变变量保存值的类型,但这在ECMAScript中是完全有效的。

1. var 声明作用域

使用 var操作符定义的变量会成为包含它的函数的局部变量。比如,使用 var在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁:

function xhsTest() {

var xhsRookies = ‘hi’ // 局部变量

}

xhsTest()

console.log(xhsRookies) // 出错!

这里,xhsRookies变量是在函数内部使用var 定义的。函数叫 xhsTest(),调用它会创建这个变量并给它赋值。调用之后变量随即被销毁,因此示例中的最后一行会导致错误。不过,在函数内定义变量时省略 var操作符,可以创建一个全局变量:

function xhsTest() {

xhsRookies = ‘hi’ // 全局变量

}

xhsTest()

console.log(xhsRookies) // “hi”

去掉之前的 var之后,xhsRookies 就变成了全局变量。只要调用一次函数 xhsTest(),就会定义这个变量,并且可以在函数外部访问到。

虽然可以通过省略 var 操作符定义全局变量,但不推荐这么做。在局部作用域中定义的全局变量很难维护,也会造成困惑。

如果需要定义多个变量,可以在一条语句中用逗号分隔每个变量(及可选的初始化):

var xhsRookies = ‘hi’,

xhsFound = false,

xhsNumber = 29

这里定义并初始化了 3 个变量。

2. var 声明提升

使用 var时,下面的代码不会报错。这是因为使用这个关键字声明的变量会自动提升到块作用域 5 顶部:

{

console.log(xhsNumber) // undefined

var xhsNumber = 26

}

之所以不会报错,是因为 ECMAScript 运行时把它看成等价于如下代码:

{

var xhsNumber

console.log(xhsNumber) // undefined

xhsNumber = 26

}

这就是所谓的“提升”(hoist),也就是把所有变量声明都拉到块作用域的顶部。

let 声明

letvar的作用差不多,但有着非常重要的区别。最明显的区别是,let声明的范围是块作用域, 而var 声明的范围是函数作用域。

{

var xhsRookies = ‘xhs-rookies’

console.log(xhsRookies) // xhs-rookies

}

console.log(xhsRookies) // xhs-rookies

{

let xhsNumber = 26

console.log(xhsNumber) // 26

}

console.log(xhsNumber) // ReferenceError: xhsNumber 没有定义

在这里,xhsNumber变量之所以不能在块作用域外部被引用,是因为它的作用域仅限于该块内部。块作用域是函数作用域的子集,因此适用于 var的作用域限制同样也适用于let

let也不允许同一个块作用域中出现冗余声明。这样会导致报错:

var xhsRookies

var xhsRookies

let xhsNumber

let xhsNumber // SyntaxError;标识符xhsNumber已经声明过了

当然,JavaScript 引擎会记录用于变量声明的标识符及其所在的块作用域,因此嵌套使用相同的标识符不会报错,而这是因为同一个块中没有重复声明:

var xhsRookies = ‘xhs-rookies’

console.log(xhsRookies) // ‘xhs-rookies’

{

var xhsRookies = ‘xhs-rookies-boy’

console.log(xhsRookies) // ‘xhs-rookies-boy’

}

let xhsNumber = 30

console.log(xhsNumber) // 30

{

let xhsNumber = 26

console.log(xhsNumber) // 26

}

对声明冗余报错不会因混用letvar而受影响。这两个关键字声明的并不是不同类型的变量, 它们只是指出变量在相关作用域如何存在。

var xhsRookies

let xhsRookies // SyntaxError

let xhsNumber

var xhsNumber // SyntaxError

1. 全局声明

var关键字不同,使用 let 在全局作用域中声明的变量不会成为window对象的属性(var声明的变量则会)。

var xhsRookies = ‘xhsRookies’

console.log(window.xhsRookies) // ‘xhsRookies’

let xhsNumber = 26

console.log(window.xhsNumber) // undefined

不过,let声明仍然是在全局作用域中发生的,相应变量会在页面的生命周期内存续。因此,为了 避免 SyntaxError,必须确保页面不会重复声明同一个变量。

2. let 作用域

总结一下

面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。

还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。

万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。

为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

前端面试题汇总

JavaScript

性能

linux

前端资料汇总

前端工程师岗位缺口一直很大,符合岗位要求的人越来越少,所以学习前端的小伙伴要注意了,一定要把技能学到扎实,做有含金量的项目,这样在找工作的时候无论遇到什么情况,问题都不会大。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

inux**

前端资料汇总

前端工程师岗位缺口一直很大,符合岗位要求的人越来越少,所以学习前端的小伙伴要注意了,一定要把技能学到扎实,做有含金量的项目,这样在找工作的时候无论遇到什么情况,问题都不会大。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-9J6CKTIW-1713687144325)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值