第一章JavaScript简介
js是一门,高级,动态,解释型编程语言
每种语言都必须有一个平台或标准库,用于执行包括基本输入和输出在内的基本操作.核心js语言定义了最小限度的API,可以操作数组,文本,数组,集合,映射等,但不包括任何输入输出的功能.输入和输出(以及更加复杂的特性,如联网,存储和图形处理)是内嵌js的"宿主环境"的责任.
浏览器是js最早的宿主,也是js代码最常见的运行环境,浏览器环境允许js代码从用户的鼠标和键盘或者发送http请求获取输入,也允许js代码通过html和css向用户显示输出.
2010年后,js代码又有了另一个宿主环境.与限制js只能使用浏览器提供的API不同,Node给予了js访问整个操作系统的权限,允许js程序读取文件,通过网络发送和接受数据,以及发送和处理http请求.Node是实现web服务器的一种流行方式,也是编写可替代shell脚本的简单使用脚本的便捷工具.
本书,大部分内容聚焦js语言本身.11章讲述js标准库,15章介绍浏览器宿主,16章介绍node宿主环境.
全书首先从底层基础讲起,然后逐步过渡到高级以及更加抽象的层次.
探索JavaScript
要尝试js代码,最简单的方式就是,打开浏览器的web开发工具f12,然后选择console控制台.之后就可以在提示符后面输入代码.
另一种方式是下载node安装node之后,打开终端窗口,然后输出node回车,想下面这样开始交互式js会话.
Hello World
浏览器控制台console.log(“hello world”)
JavaScript之旅
本章之后,我们将深入js的最底层,第二章将解释js注释,分号和Unicode字符集,第三章会更加有意思.
let x;
x = 0;
x // 0
x = 1;
x = 0.01;
x = "hello world"
x = false
x = null
x = undefined
x = {
a:"js niubi"
}
x.a = 10
x["a"] = 10
a?.b
示例:字符频率柱形图
该程序从标准输入读取文本,计算该文本的字符频率柱形图,然后打印出来
// 1字符频率柱形图.js
/*
* @Author: zou-hong-run zhr19853149156@163.com
* @Date: 2023-03-06 15:56:05
* @LastEditors: zou-hong-run zhr19853149156@163.com
* @LastEditTime: 2023-03-06 16:26:53
* @FilePath: \JavaScript\js\1字符频率柱形图.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
/**
* 这个node程序从标准输入中读取文本,计算文本中每个字母出现的频率,
* 然后按照使用的频率降序显示一个柱形图,
* 运行这个程序需要node 12或更高版本
*
*/
// 这个类扩展了Map,以便get()方法在key不在映射中时返回指定的值,而不是null
class DefaultMap extends Map{
constructor(defaultValue){
super()
this.defaultValue = defaultValue
}
get(key){
if(this.has(key)){// 如果映射中有key
return super.get(key)// 从超类中返回值
}else{
return this.defaultValue// 否则返回默认值
}
}
}
// 这个类计算并显示字母的频率柱形图
class Histogram{
constructor(){
this.letterCounts = new DefaultMap(0);// 字母到数量的映射
this.totalLetters = 0;// 字母总数
}
add(text){
// 移除文本中空白,然后将字母转换为大写
text = text.replace(/\s/g,"").toUpperCase();
// 循环文本中的字符
for (const character of text) {
let count = this.letterCounts.get(character);// 取得之前的数量
this.letterCounts.set(character,count+1);// 递增
this.totalLetters++;
}
}
// 将柱形图转换为字符串并显示ASCII图形
toString(){
// 把映射转换为一个[key,value]数组的数组
let entries = [...this.letterCounts];
entries.sort((a,b)=>{// 这个函数定义排序的方式
if(a[1] === b[1]){ // 如果数量相同
return a[0]<b[0]?-1:1;// 按字母表排序
}else{
return b[1] - a[1];// 数量大的牌前面
}
})
// 把数量转换为百分比
for (const entry of entries) {
entry[1] = entry[1] / this.totalLetters * 100
}
// 删除小于1%的条目
entries = entries.filter(entry=>entry[1]>=1);
// 接着把每个条目转换为一行文本
let lines = entries.map(
([l,n])=> `${l}:${"#".repeat(Math.round(n))}${n.toFixed(2)}%`
);
return lines.join("\n");
}
}
// 这个async函数创建爱你一个Histogram对象
// 从标准输入异步读取文本块,然后,把这些块添加到柱形图中
async function histogramFromStdin(){
process.stdin.setEncoding('utf-8');// 读取Unicode字符串,而非字母
let histogram = new Histogram()
for await(let chunk of process.stdin){
histogram.add(chunk)
}
return histogram
}
histogramFromStdin().then(histogram=>{
console.log(histogram.toString());
})
小结
后面会学到,
注释,标识符,变量,类型,
然后是表达式,语句,对象和函数
接着是
类和模块等