[编程开发] JavaScript 是什么?

[复制链接]
wzgyss 发表于 2023-11-4 13:25:47|来自:北京 | 显示全部楼层 |阅读模式
本以为 JavaScript 就是和 VBScript 一样只是 ASP 支持的语言而已,可是我又看到在各个方面也都用到了了JavaScript,故而对此感到混乱,望解答。
全部回复5 显示全部楼层
www.im286.net 发表于 2023-11-4 13:26:40|来自:北京 | 显示全部楼层
所以 JavaScript 到底是什么?我居然懵了  

引用《JavaScript 高级程序设计第四版》中说的话 ——“从简单的输入验证脚本到强大的编程语言,JavaScript 的崛起没有任何人预测到。它很简单,学会用只要几分钟;它又很复杂,掌握它要很多年。要真正学好用好 JavaScript,理解其本质、历史及局限性是非常重要的”。
面试官:JavaScript 是什么?
我:em... JavaScript 就是 JavaScript...  
试想一下,如果面试官问你:JavaScript 是个啥?你会怎么回答呢?说实话,听到这个问题的时候我的脑子是有一瞬间是空白的。我们学了这么久的前端,连最简单的 “JavaScript 是什么?” 这个问题都不能跟面试官马上说出个所以然。今天我们就这个问题来聊一聊,当面试官问你 JavaScript 是什么的时候,你可以从哪几个点切入,尽可能说多、说全并且给面试官留下一个好印象。
JavaScript 的定位是什么?

1. JavaScript 是脚本编程语言

为什么是脚本编程语言呢?我们先来简单看看关于 JavaScript 问世的风风雨雨,一句话带过就是,1995 年网景公司为了解决 页面中简单的表单验证时客户端和服务端通信时延 推出了的一款叫做 JavaScript 的客户端脚本语言并且在当时取得了很大的成果,这时微软决定向 IE 投入更多资源,针对性推出 JScript,再到 Ecma (欧洲计算机制造商协会)推出 ECMAScript (发音为 “ek-ma-script”)国际标准化了两门语言,来解决两个版本并存问题。
脚本语言能干啥呢?它可以在网页上实现复杂的功能,包括操作页面中的 DOM 元素、CSS 样式,能实现交互式的地图,2D/3D 动画,滚动播放的视频等等。JavaScript 在它所在的宿主环境中具有非常强大且灵活的能力,给开发人员提供了更多的可能性。
2. JavaScript 是弱类型语言

这意味着变量可以被隐式地转换为另一个类型。类型的隐藏转换,给 JavaScript 带了了一定的灵活性,但是也增加了规则的复杂度与发生错误的可能性。

  • 二元运算符 + 会把两个操作数转换为字符串,除非两个操作数都为数字类型。这是因为 + 也可以用来连接字符串。
  • 二元操作符 - 会把两个操作数转换为数字类型。
  • 一元操作符,包括 + 和 -,都会把操作数转换为数字。
console.log(1 + '2' === '12')
// true
console.log('3' - '1' === 2)
// true
console.log(+'1' === 1)
// true
console.log(-'1' === -1)
// true
3. JavaScript 是动态类型的


  • 正如大部分脚本语言,其类型与值而不是与变量关联。例如变量可以为数值,随后又可被赋值为字符串。
let a = 233
a = '弹铁蛋同学'
console.log(a)
// '弹铁蛋同学'

  • 可以在运行时直接执行 Javascript 语句
eval("console.log('弹铁蛋同学')")
// '弹铁蛋同学'
4. JavaScript 是单线程的

JavaScript 需要和页面进行交互,操作 DOM 等,如果是多线程的话,会带来很复杂的同步问题。比如,假定 JavaScript 同时有两个线程,一个线程在某个 DOM 节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?所以这决定了它只能是单线程,
5. JavaScript 解释型语言

解释型语言(英语:Interpreted language)是一种编程语言类型。这种类型的编程语言,会将代码一句一句直接运行,不需要像编译型语言(Compiled language)一样,经过编译器先行编译为机器代码,之后再运行。
6. JavaScript 具有良好的跨平台性

跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如 Windows、Linux、Mac、Android、iOS 等)。
JavaScript 和 ECMAScript 有什么区别,以及和 DOM 、BOM 的关系?

首先简单概括 ECMAScript、 DOM 、BOM 三者概念吧。
DOM

DOM(文档对象模型),提供了与网页内容交互的 方法 和 接口。 DOM 将整个页面抽象为一组分层节点。HTML 或 XML 页面的每个组成部分都是一种节点,包含不同的数据。DOM 通过创建表示文档的树,让开发者可以随心所欲地控制网页的内容和结构。使用 DOM API,可以轻松地删除、添加、替换、修改节点。
<html>
        <head>
            <title>Sample Page</title>
        </head>
        <body>
            <p> Hello World!</p>
        </body>
</html>



BOM

BOM(浏览器对象模型),提供了与浏览器交互的 方法 和 接口。 BOM 主要针对浏览器窗口和子窗口 (frame)。使用 BOM,开发者可以操控浏览器显示页面之外的部分, 比如:
1)弹出新浏览器窗口的能力;
2)移动、缩放和关闭浏览器窗口的能力;
3)navigator 对象,提供关于浏览器的详尽信息;
4)location 对象,提供浏览器加载页面的详尽信息;
5)screen 对象,提供关于用户屏幕分辨率的详尽信息;
6)performance 对象,提供浏览器内存占用、导航行为和时间统计的详尽信息;
7)对浏览器存储相关的操作比如 cookies、sessionStorage 、localStorage 等;
8)其他自定义对象,如 XMLHttpRequest 和 IE 的 ActiveXObject;
ECMAScript

ECMAScript 描述了 JavaScript 的语法和基本对象:1)语法;2)类型;3)语句;4)关键字;5) 保留字;6)操作符;7)全局对象;
ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版,所以一句话描述就是,ECMAScript 是一套规范,JavaScript 则是 ECMAScript 一种实现。为什么说是一种实现呢,因为 Adobe ActionScript 同样也实现了 ECMAScript,JScript 也同样实现了 ECMAScript。
[ES 版本相关]
关系

所以在简单了解了上面几个关键的概念之后我们就很容易得出他们之间的关系啦!在《JavaScript 高级程序设计第四版》中有这样一张图,将 JavaScript 、ECMAScript、 DOM 、BOM 四者的关系描述的非常清晰。




我们得出结论: ECMAScript、 DOM 、BOM 是 JavaScript 的组成部分。
总结

所以看到文章最后,当面试官问:”JavaScript 是什么 “ 的时候,我们就知道从哪开始说,从哪些方面开始讲。所以如果我们把这篇文章的要点都和面试官说清楚了的话,相信可以给面试官留下一个不至于太糟糕的印象

  • JavaScript 的定位

    • JavaScript 是脚本编程语言
    • JavaScript 是弱类型语言
    • JavaScript 是动态类型的
    • JavaScript 是单线程的
    • JavaScript 解释型语言
    • JavaScript 具有良好的跨平台性



  • JavaScript 和 ECMAScript 的区别,以及和 DOM 、BOM 的关系

    • DOM(文档对象模型),提供了与网页内容交互的 方法 和 接口
    • BOM(浏览器对象模型),提供了与浏览器交互的 方法 和 接口
    • ECMAScript 描述了 JavaScript 的语法和基本对象


最后还是引用开头那段话,” 要真正学好用好 JavaScript,理解其本质、历史及局限性是非常重要的 “ ,一起共勉~

  • 感谢关注、点赞、收藏~❤️
  • Github 原文
参考


  • 《JavaScript 高级程序设计第四版》
  • 维基百科 JavaScript
  • ECMAScript 6 简介
弹铁蛋同学:所以 JavaScript 到底是什么?我居然懵了
kpyes 发表于 2023-11-4 13:27:40|来自:北京 | 显示全部楼层
我们一起来聊一下 JavaScript,用它能做什么,它有哪些特性,以及一些跟它配合使用的技术。
什么是 JavaScript?

JavaScript 最初的目的是为了“赋予网页生命”。
这种编程语言我们称之为脚本。它们可以写在 HTML 中,在页面加载的时候会自动执行。
脚本作为纯文本存在和执行。它们不需要特殊的准备或编译即可运行。
这方面,JavaScript 和 Java 有很大的区别。
为什么叫 JavaScript?
JavaScript 在刚诞生的时候,它的名字叫 “LiveScript”。但是因为当时 Java 很流行,所以决定将一种新语言定位为 Java 的“弟弟”会有助于它的流行。
随着 JavaScript 的发展,它已经变成了一门独立的语言,同时也有了自己的语言规范 ECMAScript。现在,它和 Java 之间没有任何关系。
现在,JavaScript 不仅仅是在浏览器内执行,也可以在服务端执行,甚至还能在任意搭载了 JavaScript 引擎 的设备中都可以执行。
浏览器中嵌入了 JavaScript 引擎,有时也称作 JavaScript 虚拟机。
不同的引擎有不同的“代号”,例如:

  • V8 —— Chrome 和 Opera 中的 JavaScript 引擎。
  • SpiderMonkey —— Firefox 中的 JavaScript 引擎。
  • ……还有其他一些代号,像“Trident”,“Chakra”用于不同版本的 IE,“ChakraCore”用于 Microsoft Edge,“Nitro”和“SquirrelFish”用于 Safari,等等。
上面这些名称很容易记忆,因为经常出现在网上开发者的文章中。我们也会用到这些名称。例如:某个新的功能,如果“JavaScript 引擎 V8 是支持的”,那么我们可以认为这个功能大概能在 Chrome 和 Opera 中正常运行。
引擎是如何工作的?
引擎很复杂,但是基本原理很简单。

  • 引擎(通常嵌入在浏览器中)读取(“解析”)脚本。
  • 然后将脚本转化(“编译”)为机器语言。
  • 然后这机器语言代码快速地运行。
引擎会对流程中的每个阶段都进行优化。它甚至可以在运行时监视编译的脚本,分析数据流并根据这些对机器代码应用优化。最后,脚本会执行地非常快。
浏览器中的 JavaScript 能做什么?

现代的 JavaScript 是一种“安全”语言。它不提供对内存或 CPU 的底层访问,因为它最初是为浏览器创建的,不需要这些功能。
JavaScript 的能力很大程度上依赖于它执行的环境。例如:Node.js 允许 JavaScript 读写任意文件、执行网络请求等。
浏览器中的 JavaScript 可以做与网页操作、用户交互和 Web 服务器相关的所有事情。
例如,浏览器中的 JavaScript 可以完成下面这些事:

  • 在网页中插入新的 HTML,修改现有的网页内容和网页的样式。
  • 响应用户的行为,响应鼠标的点击或移动、键盘的敲击。
  • 向远程服务器发送网络请求,下载或上传文件(所谓 AJAX 和 COMET 技术)。
  • 获取或修改 cookie,向访问者提出问题、发送消息。
  • 记住客户端的数据(本地存储)。
浏览器中的 JavaScript 不能做什么?

为了用户的(信息)安全,在浏览器中的 JavaScript 的能力是有限的。这样主要是为了阻止邪恶的网站获得或修改用户的私人数据。
这些限制的例子有:

  • 网页中的 JavaScript 不能读、写、复制及执行用户磁盘上的文件或程序。它没有直接访问操作系统的功能。
    现代浏览器允许 JavaScript 做一些文件相关的操作,但是这个操作是受到限制的。仅当用户使用某个特定的动作,JavaScript 才能操作这个文件。例如,把文件“拖”到浏览器中,或者通过 <input> 标签选择文件。
    JavaScript 有很多方式和照相机/麦克风或者其他设备进行交互,但是这些都需要提前获得用户的授权许可。所以,启用了 JavaScript 的网页应该不会偷偷地启动网络摄像头观察你,并把你的信息发送到美国国家安全局。
  • 不同的浏览器标签页之间基本彼此不相关。有时候,也会有一些关系。例如,一个标签页通过 JavaScript 打开另外一个新的标签页。但即使在这种情况下,如果两个标签页打开的不是同一个网站(域名、协议或者端口任一不相同的网站),他们都不能够相互通信。
    这就是“同源策略”。为了解决“同源策略”问题,两个标签页必须包含一些处理这个问题的特殊的 JavaScript 代码,并均允许数据交换,这样才能够实现两个同源标签页的数据交换。本教程会讲到这部分相关的知识。
    这个限制也是为了用户的信息安全。例如,用户打开的 http://anysite.com 网页的 JavaScript 肯定不能访问 http://gmail.com(另外一个标签页打开的网页)也不能从那里窃取信息。
  • JavaScript 通过互联网可以轻松地和当前网页域名的服务器进行通讯。但是从其他网站/域名的服务器中获取数据的能力是受限的。尽管这可以实现,但是需要来自远程服务器的明确协议(在 HTTP 头中)。这也是为了用户的数据安全。




浏览器环境外的 JavaScript 一般没有这些限制。例如服务端的 JavaScript 就没有这些限制。现代浏览器还允许安装可能会要求扩展权限的插件或扩展。
是什么使得 JavaScript 与众不同?

至少有 3 件事值得一提:
+ 和 HTML/CSS 完全的集成。
+ 使用简单的工具完成简单的任务。
+ 被所有的主流浏览器支持,并且默认开启。满足这三条的浏览器技术也只有 JavaScript 了。
这就是为什么 JavaScript 与众不同!这也是为什么它是创建浏览器界面的最普遍的工具。
此外,JavaScript 还支持创建服务器,移动端应用程序等。
比 JavaScript “更好”的语言

不同的人喜欢不同的功能,JavaScript 的语法也不能够满足所有人的需求。
这是正常的,因为每个人的项目和需求都不一样。
所以,最近出现了很多不同的语言,这些语言在浏览器中执行之前,都会被编译(转化)成 JavaScript。
现代化的工具使得编译速度非常快速且透明,实际上允许开发人员使用另一种语言编写代码并将其自动转换为 JavaScript。
这些编程语言的例子有:

  • CoffeeScript 是 JavaScript 的语法糖,它语法简短,明确简洁。通常使用 Ruby 的人喜欢用。
  • TypeScript 将注意力集中在增加严格的数据类型。这样就能简化开发,也能用于开发复杂的系统。TypeScript 是微软开发的。
  • Flow 也添加了数据类型,但是以一种不同的方式。由 Facebook 开发。
  • Dart 是一门独立的语言。它拥有自己的引擎用于在非浏览器环境中运行(如:手机应用),它也能被编译成 JavaScript 。由 Google 开发。
还有很多其他的语言。当然,即使我们在使用这些语言,我们也需要知道 JavaScript。因为学习 JavaScript 可以让我们真正明白我们自己在做什么。
总结


  • JavaScript 最开始是为浏览器设计的一门语言,但是现在也被用于很多其他的环境。
  • 现在,JavaScript 是一门在浏览器中使用最广、并且能够很好集成 HTML/CSS 的语言。
  • 有很多其他的语言可以被编译成 JavaScript,这些语言还提供了更多的功能。最好还是了解一下这些语言,至少在掌握了 JavaScript 之后简单地看一下。

我是程序员客栈,领先的程序员自由工作平台。
上古幽灵 发表于 2023-11-4 13:28:09|来自:北京 | 显示全部楼层
一组语法 + 一组形式语义 + 一组 SDT
娘的我不想填坑 Formal JavaScript 啊,要写完太特么长了啊……
llcpf 发表于 2023-11-4 13:28:33|来自:北京 | 显示全部楼层
简单来说JavaScript是这么一个语言:
1、他爹创造它的时候,中意的是函数式,但是公司要他弄的像Java一点。当然,最后这个语言其实更像C,算是C风格的函数式脚本语言,除了名字里面有个Java。
2、他爹只用了十天的时间完成这个语言,然后互联网花了十几年在这个语言羸弱的语法上整出了面向对象,命名空间、AJAX等等Pattern,更有各种书籍规范介绍怎么避开这个语言的坑。
3、在开始的几年里,这个语言一直被当做脚本来使用,随着互联网的发展,人们对动态内容的需求增多,从而发明了AJAX技术。
4、然后有个叫做Google的公司用这个脚本语言做了一个邮件客户端,人们不得不开始重新审视这一“脚本”语言。
5、旋即,Google发现HTML和JavaScript是自己唯一能够掌控的平台,遂在上面加大投入,这一转折让我对Google的不作恶信条产生动摇。
6、Google用尽全力终于把这个脚本语言的性能提升到了极致,也就是V8引擎。用事实告诉我们,语言设计的烂没有关系,主要看干爹有多少钱。

补充回答LZ的问题,JavaScript的兼容语言JScript是WSH(Windows脚本宿主)支持的脚本语言之一,所以可以用于ASP开发,但事实上严格来说用于ASP的是JScript(这个语言语法与JavaScript是兼容的)
qinzusong 发表于 2023-11-4 13:28:49|来自:北京 | 显示全部楼层
推荐你看一下阮一峰先生的博客:
解答你的问题:
Javascript 诞生记:http://www.ruanyifeng.com/blog/2011/06/birth_of_javascript.html
一些扩展阅读:

  • 学习Javascript的书籍:http://www.ruanyifeng.com/blog/2008/01/javascript_book_recommendation.html
  • Javascript的10个设计缺陷:http://www.ruanyifeng.com/blog/2011/06/10_design_defects_in_javascript.html
  • javascript 继承机制的设计思想:http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
  • javascript面向对象编程(一)封装:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html
  • Javascript面向对象编程(二)构造函数的继承:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html
  • Javascript面向对象编程(三)非构造函数的继承:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html
  • Javascript的This用法:http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则