JavaScript是当下最流行的编程语言之一,以下简称JS。虽然JS 主要是用于前端页面的开发,但是实际上,它如今能做的事情有很多:
当下,后端开发可选择的语言,有很多很多,如Java,C++,Go,Python,PHP……但是,前端开发这里,JS一家独大。
但是,江山代有人才出,也会出现js的挑战者:
有关JS的发展历史,这里不多讲,有兴趣可以到网上查查资料。
简单来说:HTML就是骨架,CSS就是外皮,而JavaScript就是灵魂
浏览器分成渲染引擎 + JS 引擎.
我们如果要想执行js,需要有一个js的执行引擎,JS 引擎通过逐行读取 JS 代码内容, 然后解析成二进制指令, 再执行。
Node.js 这是一个js的运行平台.(对标的是浏览器) 浏览器是运行在客户端的.
Node.js 既可以运行在客户端,也可以运行在服务器上(单独的执行程序).就可以给js赋予客户端开发/服务器开发的能力
vue.js这个只是一个单纯的基于js 实现的在浏览器上运行的库/框架
对于在浏览器上执行的JS来说,可以视为是分成三个部分:
对于在Node.js 上执行的JS来说,就是分成两个部分:
ECMAScript:这是一套 “标准”, 无论是啥样的 JS 引擎都要遵守这个标准来实现
JavaScript 代码可以嵌入到 HTML 的 script 标签中
<script>
alert("hello world!");
</script>
把代码写到 script 标签中:
<script>
alert("hello world!");
</script>
直接嵌入到 html 元素内部:
<button onclick="alert('hello')">我是一个按钮</button>
把js 写到一个单独的.js 文件中.在html里面通过script来引入
<script src="testjs.js">
</script>
这种情况下 script 标签中间不能写代码. 必须空着(写了代码也不会执行).适合代码多的情况.
单行注释 // [建议使用]
多行注释 /* */
弹出一个输入框
// 弹出一个输入框
prompt("请输入您的姓名:");
弹出一个警示对话框, 输出结果
// 弹出一个输出框
alert("hello");
console 是一个 js 中的 “对象”
. 表示取对象中的某个属性或者方法. 可以直观理解成 “的”
所以, console.log 就可以理解成: 使用 “控制台” 对象 “的” log 方法
在控制台打印一个日志(供程序员看)
// 向控制台输出日志
console.log("这是一条日志");
什么是日志?
日志是记录系统运行过程中各种重要信息的文件,在系统运行过程中由各进程创建并记录。
日志的作用是记录系统的运行过程及异常信息,为快速定位系统运行中出现的问题及开发过程中的程序调试问题提供详细信息。
创建变量(变量定义/变量声明/变量初始化),JavaScript不区分整型,浮点型
var num = 1; //创建一个名字为num的数字类型的变量
var s = 'hello'; //创建一个名字为s,字符串类型的变量
var arr = []; //创建一个名字为arr,数组类型的变量
一读取二修改
var age = 10;
age = 30; // 修改变量内容
console.log(age); // 读取变量内容
示例:弹框提示用户输入信息, 再弹框显示
<script>
var name = prompt("请输入姓名:");
var age = prompt("请输入年龄:");
var score = prompt("请输入分数");
alert("您的姓名是:" +name);
alert("您的年龄是:" + age);
alert("您的分数是:" + score);
</script>
也可以把三个输出内容合并成一次弹框
<script>
var name = prompt("请输入姓名:");
var age = prompt("请输入年龄:");
var score = prompt("请输入分数");
alert("您的姓名是: " + name + "\n" + "您的年龄是: " + age + "\n" + "您的分数是: " +
score + "\n");
</script>
JavaScript 中还支持使用 let 定义变量. 用法和 var 基本类似,现在更倾向于用let来替代var。
在变量的修改的时候,有个小问题:如果本来a是一个数字类型,在赋值的时候,可以给它赋一个数字类型,也可以赋一个字符串类型,也可以赋任意类型.这个时候a变量的类型,也就随之发生改变了.
var a = 10;
a = 'hello';
console.log(a);
变量的类型,可以在运行过程中,随着赋值而发生改变.这种行为,称为“动态类型".
像C,C++,Java,Go,Rust.这样的语言,不支持这种运行时类型发生改变.这种行为,称为“静态类型"
如果一个编程语言,越支持隐式类型转换,认为类型越弱.(C, JS, PHP认为是弱类型的编程语言),弱类型,意味着类型之间的差异不大界限是更模糊的
如果一个编程语言,越不支持隐式类型转换,认为类型越强.(Java, Go, Python认为是强类型的编程语言),强类型,意味着类型之间的差异更大界限是更明确的
【注意】
静态类型和动态类型 与 强类型和弱类型是不相干的概念。由于C++是兼容C的,意味着C的隐式类型转换,C++也是同样支持的。因此C++介于强弱之间。
JavaScript中内置的几种类型
JS 中不区分整数和浮点数, 统一都使用 “数字类型” 来表示
计算机中都是使用二进制来表示数据, 而人平时都是使用十进制,因为二进制在使用过程中不太方便(01太多会看花眼)。
因此,在日常使用二进制数字时往往使用 八进制 和 十六进制 来表示二进制数字。
var a = 07; // 八进制整数, 以 0 开头
var b = 0xa; // 十六进制整数, 以 0x 开头
var c = 0b10; // 二进制整数, 以 0b 开头
var max = Number.MAX_VALUE;
//得到Infinity
console.log(max*2);
//得到 -Infinity
console.log(-max*2);
//得到 NaN
console.log('hello' - 10);
console.log(isNaN(10));
console.log(isNaN('hello' - 10));
字符串字面值需要使用引号引起来, 单引号双引号均可,如果都没有,则会运行出错
var a = "haha";
var b = 'hehe';
var c = hehe; // 运行出错
如果字符串中本来已经包含引号,则需要使用到转义字符。
- \n
- \
- ’
- "
- \t
字符串拼接使用 + 进行拼接。
求长度使用 String 的 length 属性即可
这个字符串类型的功能与Java的基本差不多,不再赘述。
JavaScript中, Boolean 参与运算时当做 1 和 0 来看待。
let a = true;
console.log(a+1);//这里a会被当成1来看
如果一个变量没有被初始化过, 结果就是 undefined, 是 undefined 类型
let a;
console.log(a);
undefined 和字符串进行相加, 结果进行字符串拼接
let a;
console.log(a + "11");
undefined 和数字进行相加, 结果为 NaN
let a;
console.log(a + 11);
null 表示当前的变量是一个 “空值”
let a = null;
console.log(a + 11); //11
console.log(a + "11");//null11
JavaScript的某些运算符与Java中的还是很相似的,比如算术运算符,赋值运算符与 复合赋值运算符 ,自增自减运算符,位运算,移位运算,下面着重接收不同的运算符。
JS中比较相等,有两种风格:
==与 != 只是比较两个变量的值,而不比较两个变量的类型.如果两个变量能够通过隐式类型转换,转成相同的值,此时也认为这也是相等的
=== 与 !==既要比较变量的值,也要比较类型.如果类型不相同,就直接认为不相等.
谈到比较两个对象,有三个维度的比较:
对于Java来说,:
== 比较身份.
equals可以被重写.不重写默认也是比较身份.通过重写来设定成比较值.instanceof 比较类型.
对于JavaScript来说
==只是比较值.
===同时比较值和类型
用于计算多个 boolean 表达式的值.
&& 与: 一假则假
|| 或: 一真则真
! 非
&&与|| 这俩和Java中的&&和||差别挺大的:
比如:
c = a || b
如果a的值,为真(非O),此时c的值,就是表达式a的值.如果a的值,为假(为O),此时c的值,就是表达式 b的值.
c= a && b也是类似,
如果a的值,为假, 此时c的值,就是表达式a的值.如果a的值,为真,此时c的值,就是表达式b的值.
那么,这里就衍生出了JS中的一种习惯用法,判定变量是否为"空值",如果是空值,则赋予一个默认值。
这里采用的也是短路求值,如果a这边已经能确定表达式的值了,就不必计算b了。
下面两个是等价的:
let x = null;
if( !x ){
x = 0;
}
//等价于下面
x = x ||0;
JavaScript中的条件、循环之类的语句跟Java中基本一样,也不再多说。
数组这一块与Java的还是区别挺大的,下面细讲。
(1)使用 new 关键字创建【不常用】
var arr = new Array();
说实话,有点像Java中创建一个对象。不过这种创建的方式在JavaScript中不怎么常见。
(2)使用字面量方式创建 【常用】
JavaScript的数组不要求元素是相同类型。啥都能放。在Java里面, int[]整型数组,String[]字符串数组,所以,在JS中,就只有一种数组,就叫数组。
var arr = [];
var arr1 = [1,2,'hello',false];
JavaScript 中直接通过console.log就可以打印数组内容
var arr = [];
var arr1 = [1,2,'hello',false];
console.log(arr1);
使用下标的方式访问数组元素(从 0 开始)
var arr = [1,2,'hello',false];
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
let arr = [1,2,3];
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
arr[100] =10;
console.log(arr);
可以看到,这里的长度变成了101,然后数组的内容,前三个元素还是1,2,3,下标为100的元素是10.但是中间的空属性*97意思就是,中间这些元素仍然是undefined.
let arr = [1,2,3];
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
arr[-1] =10;
console.log(arr);
arr['hello'] =10;
console.log(arr['hello']);
//arr['hello']就是在给arr这个对象,新增了一个属性.属性的名字是hello,属性的值是10.
通过 .length就可以获取
let arr = [1,2,3];
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
console.log(arr.length);
使用 push 进行追加元素
var arr = [9, 5, 2, 7, 3, 6, 8];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] % 2 != 0) {
newArr.push(arr[i]);
}
}
console.log(newArr);
使用 splice 方法删除元素
var arr = [9, 5, 2, 7];
// 第一个参数表示从下表为 2 的位置开始删除. 第二个参数表示要删除的元素个数是 1 个
arr.splice(2, 1);
console.log(arr);
【注意】
JavaScript的第一篇,写得心惊胆战,毕竟在写的时候撞到了心动的女孩。不过还是顺利完成了,虽然比预期晚了半个小时。