我哪知道啊 这句话怎么理解?

  男朋友说想我了怎么回复,你可以看看这些神回复:我和你一样啊、那你觉得我有没有想你呢?、你想我哪一点,我已经想你想得睡不着了,你刚和我说、我已经想你想得睡不着了,想我就跟我多聊一会吧、我就知道你在想我。你学会这几个高情商的回复,保证你们爱情甜蜜无比。

 男生说我想你了如何高情商的回答 教你拴住男人心

  当两个人之间迸发出爱情的火花时,彼此其实都是很羞涩而又紧张的。心里都有着对那个人的爱,但是又不敢说出口,就算对方直白地问,也不愿意轻易的将那份喜欢摆在明面上,往往会用一些暗语来作为两个人沟通的方式。

  当男人问出这句话的时候,一个聪明的女人可能会用这句话作为回答,既说明了自己在想念对方,又保全了自己的面子,不会显得太过主动,男人也会觉得心里特别甜蜜。

  2、那你觉得我有没有想你呢?

  当两个人的感情已经很稳定了,这是女人的回答就可以增添一些小情趣,可以和男人开一些小小的玩笑。这种小情趣可以增加你们之间的距离,可以让你们的聊天不那么单调,不那么无聊。当女人说出这句话时,在男人眼中看来会显得特别可爱,会让女人看起来更加幽默又有趣,会让女人看起来更加开朗。会给男人留下特别深刻的印象,聪明的男人都会读懂女人的善意的小玩笑。(情感困惑加爱燃情感导师\/信:airan63,免费一对一分析)

  女人的这个反问也会让男人觉得很有意思,男人都喜欢特别的女人,如果女人能够这样出其不意的反问他,反而会更加吸引男人的注意。平平淡淡的聊天虽然很温馨,但是却很容易就让人感到厌烦,男人更喜欢跟有趣的女人聊天。有奇思妙想的女人,神秘特别的女人更能够吸引男人的眼光。如果女人这样问了,男人肯定也会接着回答下去,两个人才能聊得更久,更有话聊。

  4、我已经想你想得睡不着了,你刚和我说

  男人害怕女人无理取闹,但是对于自己诉说想念的时候,又希望可以得到回复,那么当一个男人这样和你说的时候,你可以这样回复男人,其实还是会让男人心跳加速的,是可以让男人对你瞬间动情的。

  5、真巧,我也是这么想的

  这句话地优点就在于女人既能够表明了自己的心意,而且又不会表现地特别平淡。在男人眼里,这样的女人不仅直接而且还有情趣。生活需要技巧,爱情的表达更是需要技巧。同样的话,用不同的方式说出来就会有不一样感觉。女人这样轻松优雅的表达会给男人不一样的感觉,会让男人觉得,这个女人不仅爱我还这么聪明又有趣。

  6、想我就跟我多聊一会吧

  想这个男人的女人,肯定是经常和他保持联系。可能是因为你太忙了,她害怕会打扰到了你的工作,所以她才一直克制,可是现在男人既然说喜欢了,那她就一定会抓住这个机会,希望两个人能够多聊一会。女人会肯定地告诉男人无论什么时候都可以找她,她可以随时随地陪他聊天。

  7、可是是我先想你的

  没有男人会对这句话无动于衷的,男人都是虚荣的,这句话一定会让男人觉得非常心动。因为这句话是女人在大胆地在表达自己的爱意,没有男人会拒绝女人的爱慕。因为一般在感情生活中都是男生比女人主动一点,有的时候,男人也会希望女人能够主动,这会让男人觉得很意外和感动。女人其实也不用那么含蓄和克制,也可以大胆开放一些。

  8、我就知道你在想我

  都说男人的嘴是不可信的,当然这是对于渣男来说,最直接的形容,但是要是用在你爱的男人身上,那么就会让男人很伤心,所以当你面对的是一个自己爱的男人,就要这样说,男人会很满足。

  恋爱的时候很多人都会对对方说,我想你了,我养你啊,我爱你啊,作为恋人一定要理解对方说这话的含义,然后高智商的去回复对方,你们的感情才可以走更长远。

}

整理了知乎80条机智回答, 在这些神回复里,你能深深感受到汉语文化的博大精深…

1、怎么看待励志的书籍?

答:开卷有益。可是,看再多,那都是别人的人生。

2、男性更看重女性的相貌,还是思想?

答:相貌决定我是否想去了解她的思想,思想决定我是否会一票否决她的相貌。

3、“别让孩子输在起跑线上”,有道理吗?

答:一辈子都要和别人比较,是悲剧的源头。

4、做哪些事情,可以提升生活品质?

答:有很多。其中之一是,定期扔废品。

5、结婚后两个人在一起,最重要的是什么?

6、怎么反驳“你行你上啊”的逻辑?

答:“我评论个电冰箱,自己还得会制冷?”

7、把钱拿来念书还是环游世界更合适?

答:读书。如果没有足够的知识,即使行了万里路,你也不过是个邮差。不是吗?

8、为什么有人会产生“聪明姑娘都被憨小伙儿搞定”的印象?

答:我觉得,要么姑娘只是看起来聪明,要么小伙儿只是看起来憨…

9、你心中的完美爱情是怎么样的?

10、生活阅历,改变了你的哪些“是非观”?

答:很多事情只是不同,并无是非。

11、是不是一个人越成熟就越难爱上一个人?

答:有点,人越大会越固执,更愿意别人适应自己,而不是适应别人。但是越成熟,也越能分辨那是不是爱。

12、如何让这个世界变得美好?

答:把你自己变得更美好。

13、苦难有什么价值?

答:苦难就是苦难,苦难不值得追求。磨练意志?那是因为苦难无法躲开。

14、如何反驳“现实点,这个社会就是这样”?

答:“你是怎样,你的世界就是怎样。”

15、你对自由的理解是什么?

答:说“不”的能力。难吗?不难吗?

16、交朋友的标准是什么?

答:出世的智者,入世的强者,或者正常而阳光的普通人。

17、同样是别人比自己强,为什么有时会嫉妒,而有时会崇拜?

答:远的崇拜,近的嫉妒;够不着的崇拜,够得着的嫉妒;有利益冲突的嫉妒,没利益冲突的崇拜。

18、为什么当看到好照片时,人们通常的反应是“真不错,你用的是什么相机”,当看到烂照片时,则往往笑话拍摄者水平很水?

答:人习惯性地将自己的成功归因于自身,失败归因于环境;而将他人的成功归因于环境,失败归因于其自身。

19、怎样在有效提出推荐或建议的同时,避免给人灌输和强迫的感觉?

答:说服他人不要诉诸理性,应求于利益。

20、哪些技能,经较短时间的学习,就可以给人的生活带来巨大帮助?

21、你是如何走出人生的阴霾的?

22、二十六岁,工作三年却将留学三年,值得吗?

答:普通玩家选择标准配置,高端玩家选择自定义配置。

23、如何看待“年轻时就释怀与淡泊,是没有希望的”这句话?

答:试图用一句话就来总结复杂的人生,是没有希望的。

24、要怎样努力,才能成为很厉害的人?

答:如果你注定要成为厉害的人,那问题的答案就深藏在你的血脉里;如果你注定不是厉害的人,那你便只需要做好你自己。

25、前半生与后半生的分界线是在哪里?

26、你遇到过哪些让你眼前一亮、醍醐灌顶的理念?

答:以绝大多数人的努力程度之低,远远没有达到要去拼天赋的地步。

27、人这一生为什么要努力?

答:最痛苦的事,不是失败,是我本可以。

28、在一个足够小的星球上行走,我们是在上坡还是下坡?

答:你感觉累就是上坡,感觉轻松就是下坡。

29、听过最落寞的一句话或诗句是什么?

答:不如意事常八九,可与言者无二三。

30、三十岁才开始学习编程靠谱吗?

答:种一棵树最好的时间是十年前,其次是现在。

31、向喜欢的女生表白被拒绝了,还是喜欢她,怎么办?

答:也许你弄错了什么是表白,表白应该是最终胜利时的号角,而不应该是发起进攻的冲锋号。

32、省钱的好办法有哪些?

答:在买任何东西之前牢记九字箴言:你喜欢,你需要,你适合。

33、“知行合一”到底如何理解?又怎样运用到实际生活中?

答:知道做不到,等于不知道。

34、什么叫见过大世面?

答:能享受最好的,能承受最坏的。

35、科学和迷信的分界点是哪里?

36、扎克伯格初期是怎么保护 Facebook 创意的?为什么上线后没被其他大公司抄走?

答:保护创意的最好方法,就是将其最好地执行。

37、员工辞职最主要的原因是什么?

答:钱少事多离家远,位低权轻责任重。

38、你在生活中得到过的最好的建议是什么?

答:“过度自我关注是万恶之源”、“永远不要为尚未发生的事儿拧巴”、“觉得为时已晚的时候,恰恰是最早的时候”。

39、哪些行为是浪费时间?

答:思而不学+犹豫不决。

40、最能燃起你学习激情的一句话是什么?

答:你不能把这个世界,让给你所鄙视的人。

41、恋爱半年,女朋友觉得没有了开始时的新鲜感,怎么办?

答:所谓新鲜感,不是和未知的人一起去做同样的事情,而是和已知的人一起去体验未知的人生。

42、情商不高的例子有哪些?

答:对陌生人毕恭毕敬,对亲近的人随意发怒……

43、如何看待“年轻的时候需要的是朋友而不是人脉”?

答:没有目的之交往,才能感动人。

44、有哪些道理是你读了不信,听不进去,直到你亲身经历方笃信不疑的?

答:不要低估你的能力,不要高估你的毅力。

45、你收到的最雷的表白语是什么?

答:做我女朋友行不行,行就行,不行我再想想办法。

46、“晚来天欲雪,能饮一杯无”,怎么回复比较霸气?

答:司机一行酒,亲人两行泪。

47、如果给客户放 PPT 的时候突然蹦出来不雅图片,怎么办?

答:沉默半响,然后问:“大伙儿还困吗?——不困咱继续...”

48、和不太熟悉的女生吃饭时(有追求她的意愿),女方提出AA制,该不该接受?

答:这次我请,下次换你请。

49、同龄人中不少人结婚生子了,对你有什么影响吗?

答:对我没啥影响,对我妈影响比较大。

50、分手100天了,还没有走出来怎么办?

答:替换文件永远比删除文件更彻底。

51、如何回应“人的眼睛有 5.76 亿像素,却终究看不懂人心”?

答:你有100亿个脑细胞,却尽想些没营养的问题。

52、如何提高女朋友的智商?

答:她不喜欢你的时候,智商自然就高起来了。

53、女朋友发短信说「我想你了」,应该怎么回短信才好?

答:死脑筋啊。她发短信你就回短信?回电话啊!

54、有哪些东西你以为很贵,但其实很便宜?

答: 大学刚毕业的我。

55、有哪些时候你发现赚钱如此容易?

答:刷知乎和头条的时候。

56、你第一次跳槽是什么原因?后悔吗?

答:我上班就是为了钱,他非得和我谈理想,可我的理想是不上班…

57、去厦门鼓浪屿旅游,不能错过什么?

58、有哪些地方让你觉得“一定要跟最喜欢的人来这里”?

59、当我有话不直说的时候,为什么男友总是不明白我的心思?

答: 题主,你猜猜我的回答是什么?难道要我直接回答你才能明白?

60、如何优雅地拒绝他人的表白?

答:我知道了,你先回去等消息吧~

61、为什么绝大部分女生拒绝男生表白后都希望做朋友,这是什么心态?

答: 跟你客气一下啊,要不还能说什么,“我们不合适,我们还是做仇人吧”

62、 什么原因让你一直单身?

答:我还没找到自己,如何去找另一半?

63、互联网世界里有哪些经典谣言?

答:我已阅读并同意该条款。

64、有哪些垃圾手机软件?

答:短信拦截软件! 拦截后告诉你它拦截了一条短信。 我相信99%的人会再去点进去看一下被拦截的短信!

65、爸妈让我攒钱买房,我却想买苹果电脑怎么办?

答:你要真能3年攒50万的房子,差这1万7买个电脑么,大哥?

答: 日益增长的美好生活需要和贫穷的现实之间的矛盾。

67、既然思想是我的,那么为什么有时候我控制不了我的负面情绪?

答:操作系统不会允许用户访问、修改及删除核心系统文件,因为这会损坏系统,导致运行异常。

68、有哪些反人类的科技发明或设计?

答: 电脑连不上网,诊断以后它提示我要联网解决。

69、知乎给你带来的最小限度的好处是什么?

答:消磨时间还不觉得罪恶。

70、为什么总看到有人在抱怨工资低?

答:谁、谁在抱怨工资高?

71、怎么会有男生追女生追到一半不追了?

答:你特么倒是给个进度条啊。

72、如何优雅地表达愤怒?

73、史上最奇葩的广告语是哪句?

答:垃圾分类,从我做起。

74、有哪些人类已经发现却又无法解释的现象?

答:女朋友为什么会生气。

75、练肌肉有什么用?除了形体上的好处之外。

答:为了和脑残讲道理。

76、男朋友长得非常帅是一种怎样的体验?

答:分手的时候比较纠结。

77、你临死的遗言是什么?

答:能不能换个医生试试,我总感觉我能活。

78、如果说书籍是人类进步的阶梯......

答:那么电子书就是人类进步的电梯。

79、你看过的第一篇穿越文是什么?

80、为什么寒冷的环境可以使人变得更年轻?

答:小明爷爷今年70岁,出门冻得跟孙子似的。

}

与普通手机(Moto G4) 需要花费约 13s 来解析/编译 CNN 网站的 JS 相比, 高配 iPhone 8 仅需要约 4s 时间.这可以显著地影响用户与该站点完全交互的速度.

这突出了测试普通手机设备(如 Moto G4)的重要性而不仅仅是你口袋里的手机设备. 然而, 上下文关系也很重要: 优化网站用户的硬件设备和网络环境.

深入分析真实用户访问你的网站所使用的移动设备类型, 这样才可能明白他们真实的 CPU/GPU 等硬件约束.

另一方面, 也需要反思我们是否真的传输了太多的脚本?

通过 HTTP Archive 分析约前 500K 网站在移动设备上传输的脚本大小, 可以发现 50% 的网站需要占据 14s, 用户才可以与网站交互, 但是这些网站仅用 4s 时间来解析和编译 JS.

在获取和处理 JS 以及其他资源所需的时间中, 用户需要在页面可交互之前等待一段时间, 这一点也不奇怪, 但我们可以在这里做得更好.

移除页面上的非关键脚本不仅能减少传输时间, 也能减少 CPU 的解析/编译时间和潜在的内存开销, 这可提高页面可交互的速度.

不仅脚本的解析和编译需要时间, 脚本的执行也需要时间. 长时间的执行时间也会延迟用户与站点的交互速度.

如果脚本的执行时间超过 50ms, 那么可交互时间的延迟将是脚本下载、编译和执行脚本所花费时间的总和. — Alex Russell

为减少脚本的执行时间, 可以将脚本分成小块来执行, 以避免锁住主线程. 可以考虑是否能减少脚本在执行过程中需要完成的工作量, 如果工作量很多, 就将脚本分成小块来分解工作量, 以提高页面可交互的速度.

当你尝试着降低 JavaScript 的解析/编译和网络传输时间时, 也可以试试基于路由的代码分割或 PRPL 模式来降低 JavaScript 的交付成本.

PRPL 是一种通过代码分割和缓存来优化页面交互的模式:

通过 V8’s Runtime Call Stats, 我们可以分析一些受欢迎移动站以及 PWA 应用的加载时间. 从下图可以看出, 脚本解析所需要的时间(橙色部分)是页面加载中最耗时的一部分:

除上述方式外, JavaScript 还能通过如下方式影响页面性能:

  • 内存. 由于 GC(garbage collection), 页面可能会频繁的出现闪现或者卡顿. 当浏览器回收内存时, JS 的执行会被暂停, 所以 JS 被暂停执行的频率和浏览器回收内存的频率是正相关的, 因此需要避免内存泄漏和频繁的内存回收导致的 JS 执行暂停, 保持页面的流畅度.
  • 在运行期间, 长时间的脚本执行会阻塞主线程而导致页面没有响应. 将脚本的工作量分成多个小块来执行(使用 requestAnimationFrame()requestIdleCallback() 进行任务调度)可以最小化响应性问题.

因为优化交互性的成本比较高, 许多网站会考虑去优化内容的可见性. 当 JavaScript Bundles 很大时, 为了减少白屏时间(First paint time), 一些开发者会采用服务端渲染的方式, 当 JS 处理完成之后再将其 “升级” 为事件处理.

但这种方式也是有时间消耗的: 1) 通常会发送一个很大的 HTML 文件作为响应, 2) 在 JavaScript 完成处理之前, 页面可能只有一部分是可交互的.

因而逐步引导可能是一个更好的方式. 浏览请请求一个最小化的功能页面(仅由当前路由需要的 HTML/JS/CSS 组成), 当有更多资源请求时, 应用可以进行资源懒加载, 然后逐步解锁更多功能.

是不是很懵逼,看看浏览器缓存机制剖析

缓存一直是前端优化的主战场, 利用好缓存就成功了一半. 本篇从http请求和响应的头域入手, 让你对浏览器缓存有个整体的概念. 最终你会发现强缓存, 协商缓存 和 启发式缓存是如此的简单.

我不知道拖延症是有多严重, 反正去年3月开的题, 直到今年4月才开始写.(请尽情吐槽吧)

浏览器对于请求资源, 拥有一系列成熟的缓存策略. 按照发生的时间顺序分别为存储策略, 过期策略, 协商策略, 其中存储策略在收到响应后应用, 过期策略, 协商策略在发送请求前应用. 流程图如下所示.

废话不多说, 我们先来看两张表格.

指定缓存机制,覆盖其它设置

http1.0字段,指定缓存的过期时间

资源最后一次的修改时间

唯一标识请求资源的字符串

2.缓存协商策略用于重新验证缓存资源是否有效, 有关的key如下.

缓存校验字段, 值为资源最后一次的修改时间, 即上次收到的Last-Modified值

同上, 处理方式与之相反

缓存校验字段, 值为唯一标识请求资源的字符串, 即上次收到的ETag值

同上, 处理方式与之相反

下面我们来看下各个头域(key)的作用.

浏览器缓存里, Cache-Control是金字塔顶尖的规则, 它藐视一切其他设置, 只要其他设置与其抵触, 一律覆盖之.

不仅如此, 它还是一个复合规则, 包含多种值, 横跨 存储策略, 过期策略 两种, 同时在请求头和响应头都可设置.

假设所请求资源于4月5日缓存, 且在4月12日过期.

由于客户端总是采用最保守的缓存策略, 因此, 4月9日后, 对于该资源的请求将重新向服务器发起验证.

如下资源便采取了启发式缓存算法.

可见该资源将于2017年4月18日23点25分41秒过期, 尝试以下两步进行验证:

2) 然后又修改本地时间为2017年4月18日23点26分40秒(即往后拨1分钟), 刷新页面, 发现缓存已过期, 此时浏览器重新向服务器发起了验证, 且命中了304协商缓存, 如下所示.

可见, 启发式缓存算法采用的缓存时间可长可短, 因此对于常规资源, 建议明确设置缓存时间(如指定max-age 或 expires).

实体标签, 服务器资源的唯一标识符, 浏览器可以根据ETag值缓存数据, 节省带宽. 如果资源已经改变, etag可以帮助防止同步更新资源的相互覆盖. ETag 优先级比 Last-Modified 高.

缓存校验字段, 其值为上次收到的一个或多个etag 值. 常用于判断条件是否满足, 如下两种场景:

  • 对于其他更新服务器资源的请求, 如果其etags列表匹配, 服务器将执行更新, 反之, 将返回412(Precondition Failed)状态码的响应.

用于标记请求资源的最后一次修改时间, 格式为GMT(格林尼治标准时间). 如可用 new Date().toGMTString()获取当前GMT时间. Last-Modified 是 ETag 的fallback机制, 优先级比 ETag 低, 且只能精确到秒, 因此不太适合短时间内频繁改动的资源. 不仅如此, 服务器端的静态资源, 通常需要编译打包, 可能出现资源内容没有改变,

缓存校验字段, 其值为上次响应头的Last-Modified值, 若与请求资源当前的Last-Modified值相同, 那么将返回304状态码的响应, 反之, 将返回200状态码响应.

缓存校验字段, 语法同上. 表示资源未修改则正常执行更新, 否则返回412(Precondition Failed)状态码的响应. 常用于如下两种场景:

  • 不安全的请求, 比如说使用post请求更新wiki文档, 文档未修改时才执行更新.
  • 与 If-Range 字段同时使用时, 可以用来保证新的片段请求来自一个未修改的文档.

缓存过期后, 继续请求该资源, 对于现代浏览器, 拥有如下两种做法:

以上, ETag优先级比Last-Modified高, 同时存在时, 前者覆盖后者. 下面通过实例来理解下强缓存和协商缓存.

协商缓存的响应结果, 不仅验证了资源的有效性, 同时还更新了浏览器缓存. 主要更新内容如下:

Age:0 表示命中了代理服务器的缓存, age值为0表示代理服务器刚刚刷新了一次缓存.

当然, 除了上述与缓存直接相关的字段外, http header中还包括如下间接相关的字段.

出现此字段, 表示命中代理服务器的缓存. 它指的是代理服务器对于请求资源的已缓存时间, 单位为秒. 如下:

以上指的是, 代理服务器在2017年3月8日16:12:42时向源服务器发起了对该资源的请求, 目前已缓存了该资源2383321秒.

指的是响应生成的时间. 请求经过代理服务器时, 返回的Date未必是最新的, 通常这个时候, 代理服务器将增加一个Age字段告知该资源已缓存了多久.

对于服务器而言, 资源文件可能不止一个版本, 比如说压缩和未压缩, 针对不同的客户端, 通常需要返回不同的资源版本. 比如说老式的浏览器可能不支持解压缩, 这个时候, 就需要返回一个未压缩的版本; 对于新的浏览器, 支持压缩, 返回一个压缩的版本, 有利于节省带宽, 提升体验. 那么怎么区分这个版本呢, 这个时候就需要Vary了.

服务器通过指定Vary: Accept-Encoding, 告知代理服务器, 对于这个资源, 需要缓存两个版本: 压缩和未压缩. 这样老式浏览器和新的浏览器, 通过代理, 就分别拿到了未压缩和压缩版本的资源, 避免了都拿同一个资源的尴尬.

如上设置, 代理服务器将针对是否压缩和浏览器类型两个维度去缓存资源. 如此一来, 同一个url, 就能针对PC和Mobile返回不同的缓存内容.

怎么让浏览器不缓存静态资源

当然, 还有一种常用做法: 即给请求的资源增加一个版本号, 如下:

这样做的好处就是你可以自由控制什么时候加载最新的资源.

不仅如此, HTML也可以禁用缓存, 即在页面的

节点中加入标签, 代码如下:

上述虽能禁用缓存, 但只有部分浏览器支持, 而且由于代理不解析HTML文档, 故代理服务器也不支持这种方式.

实际上, 上述缓存有关的规律, 并非所有浏览器都完全遵循. 比如说IE8.

资源缓存是否有效相关.

重新发送请求(返回200)

原浏览器窗口中单击 Enter 按钮

重新发送请求(返回200)

浏览器重新发送请求(返回200)

重新发送请求(返回304)

原浏览器窗口中单击 Enter 按钮

重新发送请求(返回200)

  • 彻底弄懂 Http 缓存机制 – 基于缓存策略三要素分解法

最近在看《JavaScript高级程序设计》一书,书中讲到相等操作符(==)时说,要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,但要记住 null == undefined 会返回 true 。的确,在ECMAScript规范中也是这样定义的,但我认为这样来理解这件事情,似乎有些浮于表面,网上也有很多关于这个问题的文章,下面我希望从一个全新的角度来分析 null 和 undefined 的区别,从而理解两者为何会相等:

Undefined 和 Null 是 Javascript 中两种特殊的原始数据类型(Primary Type),它们都只有一个值,分别对应 undefined 和 null ,这两种不同类型的值,即有着不同的语义和场景,但又表现出较为相似的行为:

undefined 的字面意思就是未定义的值,这个值的语义是,希望表示一个变量最原始的状态,而非人为操作的结果 。 这种原始状态会在以下 4 种场景中出现:

【1】声明了一个变量,但没有赋值

访问foo,返回了undefined,表示这个变量自从声明了以后,就从来没有使用过,也没有定义过任何有效的值,即处于一种原始而不可用的状态。

【2】访问对象上不存在的属性

【3】函数定义了形参,但没有传递实参

//函数定义了形参 a
 

函数 fn 定义了形参a, 但 fn 被调用时没有传递参数,因此,fn 运行时的参数 a 就是一个原始的、未被赋值的变量。

【4】使用 void 对表达式求值

ECMAScript 规范 void 操作符 对任何表达式求值都返回 undefined ,这个和函数执行操作后没有返回值的作用是一样的,JavaScript中的函数都有返回值,当没有 return 操作时,就默认返回一个原始的状态值,这个值就是undefined,表明函数的返回值未被定义。

因此,undefined 一般都来自于某个表达式最原始的状态值,不是人为操作的结果。当然,你也可以手动给一个变量赋值 undefined,但这样做没有意义,因为一个变量不赋值就是 undefined 。

null 的字面意思是 空值 ,这个值的语义是,希望表示 一个对象被人为的重置为空对象,而非一个变量最原始的状态 。 在内存里的表示就是,栈中的变量没有指向堆中的内存对象,即:

当一个对象被赋值了null 以后,原来的对象在内存中就处于游离状态,GC 会择机回收该对象并释放内存。因此,如果需要释放某个对象,就将变量设置为null,即表示该对象已经被清空,目前无效状态。试想一下,如果此处把 null 换成 undefined 会不会感到别扭? 显然语义不通,其操作不能正确的表达其想要的行为。

与 null 相关的另外一个问题需要解释一下:

null 有属于自己的类型 Null,而不属于Object类型,typeof 之所以会判定为 Object 类型,是因为JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,因此,null 被误判断为 Object 类型。

  • 000 – 对象,数据是对象的应用
  • 1 – 整型,数据是31位带符号整数
  • 010 – 双精度类型,数据是双精度数字
  • 100 – 字符串,数据是字符串
  • 110 – 布尔类型,数据是布尔值

其实,我们可以通过另一种方法获取 null 的真实类型:

虽然 undefined 和 null 的语义和场景不同,但总而言之,它们都表示的是一个无效的值。 因此,在JS中对这类值访问属性时,都会得到异常的结果:

ECMAScript 规范认为,既然 null 和 undefined 的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也具有相似性,即有

不要试图通过转换数据类型来解释这个结论,因为:

//在比较相等性之前,null 没有被转换为其他类型

但 === 会返回 false ,因为全等操作 === 在比较相等性的时候,不会主动转换分项的数据类型,而两者又不属于同一种类型:

用一句话总结两者的区别就是:undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态。所以,在实际使用过程中,为了保证变量所代表的语义,不要对一个变量显式的赋值 undefined,当需要释放一个对象时,直接赋值为 null 即可。

}

我要回帖

更多关于 我哪知道这句话的语气 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信