5年前,学习 null 和 undefined ,现在有了新的认知,看看这位人才怎么说?

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

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

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

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

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

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

正文

  • 一个参数的值是undefined

例如:

function myFunc(arg=‘abc’) {

return arg;

}

assert.equal(myFunc(‘hello’), ‘hello’);

assert.equal(myFunc(), ‘abc’);

assert.equal(myFunc(undefined), ‘abc’);

undefined也触发了参数的默认值,这说明它是一个元值。

下面的例子说明了这一点的用处。

function concat(str1=‘’, str2=‘’) {

return str1 + str2;

}

function twice(str) { // (A)

return concat(str, str);

}

A行,我们没有为str指定一个参数默认值。当这个参数缺失时,我们把这个状态转发给concat(),让它选择一个默认值。

4.2 undefined 的和解构的默认值

解构中的缺省值与参数缺省值的工作原理类似–如果一个变量在数据中没有匹配,或者它与undefined的变量匹配,就会使用它们。

const [a=‘a’] = [];

assert.equal(a, ‘a’);

const [b=‘b’] = [undefined];

assert.equal(b, ‘b’);

const {prop: c=‘c’} = {};

assert.equal(c, ‘c’);

const {prop: d=‘d’} = {prop: undefined};

assert.equal(d, ‘d’);

4.3 undefined 和 null 以及可选链

当通过 value?.prop 进行可选的链接时

  • 如果valueundefinednull,则返回 undefined。也就是说,只要value.prop会抛出一个异常,就会发生这种情况。

  • 否则,返回value.prop

function getProp(value) {

// optional static property access

return value?.prop;

}

assert.equal(

getProp({prop: 123}), 123);

assert.equal(

getProp(undefined), undefined);

assert.equal(

getProp(null), undefined);

下面两个操作的效果类似。

obj?.[«expr»] // optional dynamic property access

func?.(«arg0», «arg1») // optional function or method call

4.4 undefined 和 null 和 nullish 聚结

nullish 合并算子??如果一个值undefined或为null,则允许我们使用默认值:

undefined ?? ‘default value’

‘default value’

null ?? ‘default value’

‘default value’

0 ?? ‘default value’

0

123 ?? ‘default value’

123

‘’ ?? ‘default value’

‘’

‘abc’ ?? ‘default value’

‘abc’

null合并赋值操作符??=:

function setName(obj) {

obj.name ??= ‘(Unnamed)’;

return obj;

}

assert.deepEqual(

setName({}),

{name: ‘(Unnamed)’}

);

assert.deepEqual(

setName({name: undefined}),

{name: ‘(Unnamed)’}

);

assert.deepEqual(

setName({name: null}),

{name: ‘(Unnamed)’}

);

assert.deepEqual(

setName({name: ‘Jane’}),

{name: ‘Jane’}

);

5. 处理 undefined 和 null


下面分享一下我们自己的代码中处理undefinednull的最常见方法。

5.1 undefined 或 null 都不能作为实际值使用

举例,我们可能希望一个属性file.title永远存在,并且永远是一个字符串。有两种常见的方法来实现这一点。

这里,只检查undefinednull,而不检查一个值是否是字符串。你必须自己决定是否要把它作为一个额外的安全措施来实施。

5.1 undefined 和 null 都是禁止的

如下所示

function createFile(title) {

if (title === undefined || title === null) {

throw new Error(‘title must not be nullish’);

}

// ···

}

为什么选择这种方法?

我们想把undefinednull当作一样的东西,因为JavaScript代码经常这样做–比如说。

// 检测一个属性是否存在

if (!obj.requiredProp) {

obj.requiredProp = 123;

}

const myValue = myParameter ?? ‘some default’;

如果我们的代码中出现了问题,出现了undefinednull,我们希望它尽可能快地失败。

5.1.2 undefined 和 null 都会触发默认值

如下所示

function createFile(title) {

title ??= ‘(Untitled)’;

// ···

}

我们不能在这里使用参数缺省值,因为它只由undefined 触发。相反,我们依靠nullish 合并赋值运算符??=

为什么选择这种方法?

  • 我们想把undefinednull同等对待(见上一节)。

  • 我们希望我们的代码能够稳健地、无声地处理 undefinednull

5.2 undefined 或 null 都是“关闭”值

例如,我们可能希望一个属性file.title是一个字符串或 “关闭”(文件没有标题)。有几种方法可以实现这一点。

5.2.1 null是 "关闭的 "值

function createFile(title) {

if (title === undefined) {

throw new Error(‘title must not be undefined’);

}

return {title};

}

另外,undefined可以触发一个默认值。

function createFile(title = ‘(Untitled)’) {

return {title};

}

为什么选择这种方法?

  • 我们需要一个表示“关闭”的非值。

  • 我们不希望我们的非值触发参数默认值和解构默认值。

  • 我们想把非值字符串化为JSON(这是我们不能用undefined做的)。

5.2.2 undefined 是"关闭的 "值。

function createFile(title) {

if (title === null) {

throw new Error(‘title must not be null’);

}

return {title};

}

为什么选择这种方法?

  • 我们需要一个表示“关闭”的非值。

  • 我们确实想让我们的非值触发参数默认值和解构默认值。

5.2.3 为什么不同时使用undefined和null作为 "关闭 "的值?

当接收一个值时,把undefinednull都当作 "不是一个值 "是有意义的。然而,当我们创建值时,我们希望不含糊,以便处理这些值时保持简单。

这指向了一种不同的方法。如果我们需要一个 "关闭"的值,但又不想使用undefinednull作为这样的值,怎么办?请往下看。

5.3 处理“关闭”的其他方式

5.3.1 特殊值

我们可以创建一个特殊的值,每当属性.title被关闭时,我们就使用这个值。

const UNTITLED = Symbol(‘UNTITLED’);

const file = {

title: UNTITLED,

};

5.3.2 空对象模式

空对象模式来自于面向对象的编程。

  • 一个共同的超类的所有子类都有相同的接口。

  • 每个子类都实现了一个实例运行的不同模式。

  • 其中一个模式是 “null”。

在下面的例子中,UntitledFile实现了 “null” 模式。

// 抽象的超类

class File {

constructor(content) {

if (new.target === File) {

throw new Error(‘Can’t instantiate this class’);

}

this.content = content;

}

}

class TitledFile extends File {

constructor(content, title) {

super(content);

this.title = title;

}

getTitle() {

return this.title;

}

}

class UntitledFile extends File {

constructor(content) {

super(content);

}

getTitle() {

return ‘(Untitled)’;

}

}

const files = [

new TitledFile(‘Dear diary!’, ‘My Diary’),

new UntitledFile(‘Reminder: pick a title!’),

];

学习笔记

主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue等等

HTML/CSS

**HTML:**HTML基本结构,标签属性,事件属性,文本标签,多媒体标签,列表 / 表格 / 表单标签,其他语义化标签,网页结构,模块划分

**CSS:**CSS代码语法,CSS 放置位置,CSS的继承,选择器的种类/优先级,背景样式,字体样式,文本属性,基本样式,样式重置,盒模型样式,浮动float,定位position,浏览器默认样式

HTML5 /CSS3

**HTML5:**HTML5 的优势,HTML5 废弃元素,HTML5 新增元素,HTML5 表单相关元素和属性

**CSS3:**CSS3 新增选择器,CSS3 新增属性,新增变形动画属性,3D变形属性,CSS3 的过渡属性,CSS3 的动画属性,CSS3 新增多列属性,CSS3新增单位,弹性盒模型

JavaScript

**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串

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

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

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

HTML5:**HTML5 的优势,HTML5 废弃元素,HTML5 新增元素,HTML5 表单相关元素和属性

**CSS3:**CSS3 新增选择器,CSS3 新增属性,新增变形动画属性,3D变形属性,CSS3 的过渡属性,CSS3 的动画属性,CSS3 新增多列属性,CSS3新增单位,弹性盒模型

[外链图片转存中…(img-ep74Xkf4-1713642610750)]

JavaScript

**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串

[外链图片转存中…(img-h3N9IThd-1713642610750)]

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

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

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

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值