javascript可以运行在浏览器,如谷歌v8引擎,在浏览器外运行在Node环境上。所以可以运用命令node index.js来运行js文件
JS和PYTHON都是动态类型语言,简单说就是可以不指明变量类型而在之后可以随时改变变量类型。
个人感觉应该先了解一下JS DOM
HTML DOM是HTML执行的一个标准,也就是HTML DOM遵循此标准来进行操作HTML元素。
在HTML中JS代码都放在 tags标签中
<script src="https://www.w3schools.com/js/myScript1.js"></script> 引用URL连接作为script
<script src="/js/myScript1.js"></script> 指定一个文件夹作为引用
<script src="myScript1.js"></script> 引用当前页面相同路径下的scrpit文件
<html>
<body>
<h1>My First Web Pageh1>
<p>My First Paragraphp>
<p id="demo">p>
1. getElementById用来获取html中的组件,innerHTML决定组件内容
这种方式很常见
<script>
document.getElementById("demo").innerHTML = 5 + 6;
script>
2.测试方便运用document.write(), 只用来测试使用
<script>
document.write(5+6);
script>
3. window.alert(); 展示一个提示框
<script>
window.alert(5+6);
script>
4.调试需求用 console.log()
<script>
consloe.log(5+6);
script>
body>
html>
以下的每一行叫做statement,JS用分号来分开JS statement,计算机来执行statement,在js中执行者是浏览器。
var a, b, c; // Declare 3 variables 声明三个变量
a = 5; // Assign the value 5 to a 给每个变量赋值
b = 6; // Assign the value 6 to b
c = a + b; // Assign the sum of a and b to c
每一行代码长度最好不要超过80个字符,如果超过了尽量在操作符如“=”后面换行。
JS的关键字中跟JAVA基本一致,但是变量为var
JS语法中有两种值:固定值和变量
固定值 literals
Numbers 包括整数和小数,不作区分
Strings 包括"John" 和 ‘John’ 单双引号不做区分
变量 variables
变量用来存储数据
JS用var声明变量用 =来给变量赋值
JS中变量命名习惯和JAVA中一样驼峰命名法
变量没有赋值的时候会被自动赋值为undefined
可以连续给变量赋值
var person = "John Doe", carName = "Volvo", price = 200;
//当变量被重新声明的时候他还是拥有之前的值。但重新赋值就会拥有新的值
var carName = "Volvo";
var carName;
var x = 2 + 3 + 5 + '3' + 5 //变量中有一个是string 则这个string后面的数字会被看成string ,前面的还是数字运算,这个输出为1035
五种基本数据类型(primitive types):
三种对象类型:
基本数据类型是值传递,对象类型是引用传递。
例子如下:
let number = 10;
function increase(num){
num++;
}
increase(number);
console.log(number);
let obj = { value: 10};
function increaseO(ob){
ob.value++;
}
increaseO(obj);
console.log(obj);
//第一个输出为10,第二个输出为11
typeof 作为查看变量类型
typeof "John" // Returns "string"
typeof 3.14 // Returns "number"
typeof true // Returns "boolean"
typeof x // Returns "undefined" (if x has no value)
typeof {name:'John', age:34} // Returns "object"
typeof [1,2,3,4] // Returns "object" (not "array", array is an object)
typeof null // Returns "object"
typeof function myFunc(){} // Returns "function"
undefined 的类型是 undefined
null类型是 object
“ “ 类型是string
JS中ES6之后就建议使用let和const而减少var的使用
//变量命名规则:1)不能以字母开头 2)不能包含空格和- 3)应该有含义
let name = 'Bin'; //用分号分割,一般用单引号写string
console.log(name);
//JS中可以在里面利用引号,但是需要和外层引号不同才有效
var answer = "It's alright"; // Single quote inside double quotes
var answer = "He is called 'Johnny'"; // Single quotes inside double quotes
var answer = 'He is called "Johnny"'; // Double quotes inside single quotes
const 在创建的时候必须赋值,赋值之后不可改变。
JS中没有赋值的变量默认赋值为undefined
JS数据类型是动态的,也就是变量类型可以变化,而java是静态类型语言,如下:
var x; // Now x is undefined
x = 5; // Now x is a Number
x = "John"; // Now x is a String
let x = 2;
let y = 3;
let z = x ** y; //x的y次方
console.log(z)
//以下三个都可以用作x自增
x++;
x = x + 1;
x += 1;
console.log(x >= 1)
console.log(x === 1) //一般用===来验证类型和值均相等
console.log('bin' || false) // bin 会显示truthy的值,|| 操作符是根据falsy来判断的,返回第一个truthy的值
//falsy值为以下几个:
//undefined
//null
// 0
// false
// ' '
// NaN
=== 表示恒等,需要类型和值都value and type相等;== 表示相等即仅仅比较两边变量的数值是否相等。
typeof undefined // undefined
typeof null // object
null === undefined // false
null == undefined // true
和java语法基本一样
let role = 1;
switch (role) {
case 1:
console.log(1)
break;
case 2:
console.log(2)
break;
default:
console.log("no user")
break;
}
//用if语句来实现,更简洁
let user = 'bin'
if (user === 'bin') console.log("no user")
else if (user === 'san') console.log("no user")
else console.log("ddd")
for :同java
while
do…while
for…in 遍历对象
for…of 遍历数组
//用for..in 来遍历对象的属性
const person = {
name: 'bin',
age: 30
}
for (let key in person) //key代表对象中的key值
{ //有两种方式来得到对象中的value值
console.log(key + " : " + person[key]); //用中括号方式来得到value值
console.log(key + " : " + person.key); //而用点的方式得到value值,点后面必须是和对象相同的key名称,所以只能用中括号的形式才是正确的
}
/*
name : bin
name : undefined
age : 30
age : undefined
*/
//用for..of来遍历数组
const colors = ['red', 'green', 'blue'];
for (let color of colors)
console.log(color);
//red
//green
//blue
const numbers = [3, 4]; //不可以重新赋值,但是可以修改里面的元素
console.log(numbers); //[ 3, 4 ]
//添加元素
numbers.push(5, 6);
console.log(numbers); //[ 3, 4, 5, 6 ]
numbers.unshift(1, 2);
console.log(numbers); //[ 1, 2, 3, 4, 5, 6 ]
numbers.splice(2, 2, 'a', 'b'); //第二个参数是删除的元素个数
console.log(numbers); //[ 1, 2, 'a', 'b', 5, 6 ]
//查找元素
console.log(numbers.indexOf('a')); //2
console.log(numbers.indexOf('c')); //-1没找到返回
console.log(numbers.includes('c')); //false
let found = numbers.find(element => {
return element > 4; //返回符合条件的第一个值
});
console.log(found); //5
const courses = [{
id: 1,
name: 'a'
},
{
id: 2,
name: 'b'
}
];
console.log(courses.includes({ //false 因为includes是查找到reference 不同
id: 1,
name: 'a'
}));
console.log(courses.find(courses => {
return courses.name === 'a'; //返回符合条件的第一个值
}));
//删除元素
const numbers2 = [1, 2, 4, 5, 6];
console.log(numbers2.pop()); //6,删除最后一个元素并作为返回值
console.log(numbers2); //[ 1, 2, 4, 5 ]
console.log(numbers2.shift()); //1
console.log(numbers2); //[ 2, 4, 5 ]
numbers2.splice(2, 1);
console.log(numbers2); //[ 2, 4 ]
//清空元素
//solution 1
let numbers3 = [1, 2, 3, 4, 5, 3];
let another3 = numbers3;
numbers3 = []; //会清空数组而不清空reference
console.log(numbers3); //[]
console.log(another3); //[ 1, 2, 3, 4, 5, 3 ]
//solution 2
let numbers4 = [1, 2, 3, 4, 5, 3];
let another4 = numbers4;
numbers4.length = 0; //会清空reference的数组
console.log(numbers4); //[]
console.log(another4); //[]
//合并元素和切断元素
const first = [1, 2, 3];
const second = [4, 5, 6];
const combined = first.concat(second);
const slice = combined.slice(2, 5); //会切断并产生一个新数组而不改变原数组
console.log(combined); //[ 1, 2, 3, 4, 5, 6 ]
console.log(slice); //[ 3, 4, 5 ]
console.log(combined); //[ 1, 2, 3, 4, 5, 6 ]
const conbined2 = [...first, 'a', ...second];
console.log(conbined2); //[ 1, 2, 3, 'a', 4, 5, 6 ]
//遍历数组,两种方式
//for遍历
for (let number of conbined2) {
console.log(number);
}
//for each遍历,可带index
numbers.forEach((number, index) => console.log(index, number));
//数组排序
conbined2.sort();
console.log(conbined2); //[ 1, 2, 3, 4, 5, 6, 'a' ]
conbined2.reverse();
console.log(conbined2); //[ 'a', 6, 5, 4, 3, 2, 1 ]
const courses2 = [{
id: 1,
name: 'a'
},
{
id: 2,
name: 'b'
},
{
id: 3,
name: 'd'
},
{
id: 4,
name: 'c'
}
];
courses2.sort((a, b) => {
if (a.name < b.name) {
console.log(-1);
return -1;
}
if (a.name > b.name) {
console.log(1);
return 1;
}
return 0;
});
console.log(courses2);
/*
[ { id: 1, name: 'a' },
{ id: 2, name: 'b' },
{ id: 4, name: 'c' },
{ id: 3, name: 'd' } ]*/
验证元素
const array = [1, -1, 2, 5];
//验证每一个元素,如果有一个不符合条件则返回false并终止
const test = array.every(value => {
return value >= 0;
});
console.log(test);//false
//验证每一个元素,至少有一个符合条件则返回true并终止
const testSome = array.some(value => {
return value >= 0;
});
console.log(testSome);//true
filter过滤出符合条件的元素
const array = [1, -1, 2, 5];
const filterNumber = array.filter(n => {
return n >= 0;
});
console.log(filterNumber); //[ 1, 2, 5 ]
map方法
const array = [1, -1, 2, 5];
const items = array.map(n => {
return {
value: n
}; //把每个值放进一个对象中
});
console.log(items); //[ { value: 1 }, { value: -1 }, { value: 2 }, { value: 5 } ]
const items2 = array.map(n => {
return '' + n + '';
});
console.log(items2); //[ '1 ', '-1 ', '2 ', '5 ' ]
const html = ''
+ items2.join('') + '';
console.log(html); //- 1
- -1
- 2
- 5
reduce方法
const array = [1, -1, 2, 5];
//计算总和
//方式1
let sum = 0;
for (let iterator of array) {
sum += iterator;
}
console.log(sum);
//方式2 用reduce,reduce表示把整个数组缩减
const sum2 = array.reduce((accumulater, currentValue) => {
return accumulater + currentValue;
}, 0); //0为设置accumulater的初始值
console.log(sum2);
得到数组最大值
const array = [1, -1, 2, 5];
//计算最大值
const max = getMax(array);
function getMax(array) {
let maxValue = 0;
for (let iterator of array) {
if (maxValue < iterator) {
maxValue = iterator;
}
}
return maxValue;
}
console.log(max);//5
//用reduce方法
const max2 = array.reduce((a, b) => {
return a > b ? a : b;
}) //a作为存储值,a的值默认是array[0]。b为每次iterator的值,每次都会把返回值存储到a
console.log(max2);//5
console.log(array);//[1, -1, 2, 5]
js中方法是对象
JS中定义函数有两种方式
//function declaration
function walk() {
console.log('walk');
}
//function expression
const run = function () { //是对象
console.log('run');
};
let move = run; //引用给move
walk(); //walk
run(); //run
move(); //run
function sum(a, b) { //形参叫parameter
console.log(arguments);
return a + b;
}
console.log(sum(1)); //NaN 这里传入的参数叫argument,a=1 b=undefined
console.log(sum(1, 2)); //3
console.log(sum(1, 2, 3, 4, 5)); //3 a=1,b=2,接收前两个参数,不会报错
/* arugments 是对象
[Arguments] { '0': 1 }
NaN
[Arguments] { '0': 1, '1': 2 }
3
[Arguments] { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }
3
*/
function sum2(a, ...args) { //rest operator
console.log(a); //1
console.log(args); //[ 2, 4, 5, 7, 8 ] array
}
sum2(1, 2, 4, 5, 7, 8);
function sum(a, b = 3, c = 4) { //可以设置参数默认值
//当设置一个参数有默认值时,他后面的参数也必须有默认值,所以要把带默认值的参数放到最后面
console.log(a + b + c);
}
sum(1); //8
const person = {
firstName: 'Ren',
lastName: 'Charles',
get fullName() { //get方法
return `${this.firstName} ${this.lastName}`;
},
set fullName(value) { //set方法,必须有parameter
const parts = value.split(' ');
this.firstName = parts[0];
this.lastName = parts[1];
}
};
console.log(person.fullName); //Ren Charles 可以直接像引用属性一样执行get方法
person.fullName = 'bin bin'; //这里执行的是set方法
console.log(person.fullName); //bin bin 执行get方法
js hoisting 就是将java的声明会放到最顶端,即使你在后面才声明。
this指针,在对象和类中指向对象,在方法或匿名回调方法中指向window
什么是json
首先可以学习一下json然后对比学习js对象
键值对,对象中前面的是property
通过两种方式来使用对象中的property
person.lastName;
person["lastName"];
定义一个对象,这种方法定义对象不太好
const circle = {
radius: 1,
location: {
x: 1,
y: 2
},
draw: function () { //在对象中叫method在对象外叫function
console.log("draw");
}
};
circle.draw(); //call method
这两种方法已经过时,但是可能其他人会用到所以应该学习看懂。
JS中没有类只有对象,所以用创建函数的方式来创建类
创建类的两种方式:两种方式都可以创建类,只是看倾向于哪一种,java程序员更倾向于第二种,跟java中类很相似。
//1.factory function 返回值是一个对象
function creatCircle(radius) {
return {
radius,
draw() {
console.log('draw');
}
};
}
const myCircle = creatCircle(1); //创建对象
myCircle.draw();
//2.construct function naming: pascle name 有this 标志 ,注意这里是方法,所以用分号
function Circle(radius) {
this.radius = radius;
this.draw = function () {
console.log('draw');
}
}
//创建的对象
const circle = new Circle(1);
circle.draw();
//克隆对象
const another = { ...circle
};
利用const创建对象,不能再重新赋值这个对象,但是可以修改对象里的属性,添加和删除。删除对象中的属性,可以用 delete obj.property
const circle = {
radius: 1
};
circle.color = 'yellow';
circle.draw = function () {
console.log("dddd")
};
circle.draw();
delete circle.color;
delete circle.draw;
//circle.draw(); 报错
let x = 10;
let y = x;
console.log(y); //10
x = 20;
console.log(y); //10 y值不会修改
let i = {
value: 10
};
let j = i;
console.log(j); //10
i.value = 20;
console.log(j); //20 y值会被修改
遍历对象
function Circle(radius) {
this.radius = radius;
this.draw = function () {
console.log('draw');
}
}
const circle = new Circle(10);
//遍历对象属性
for (let key in circle) {
if (typeof circle[key] !== 'function') //只显示非函数的属性
console.log(key, circle[key]);
}
//遍历对象key
const keys = Object.keys(circle);
console.log(keys); //[ 'radius', 'draw' ]
//查看是否包含某个key
if ('radius' in circle)
console.log('Circle has a radius');
const name = 'Charles';
const another =
`
Hi ${name},
Thank you very much!
regards!!
`;
console.log(another);//会按照代码原格式输出
const now = new Date();
const date1 = new Date('May 11 2018 10:00');
const date2 = new Date('2018-03-11T10:00:00.000Z') //一般用这个时间作为客户端和服务器通用的时间
console.log(now); //2019-01-12T23:32:39.012Z
console.log(now.toISOString()); //2019-01-12T23:32:39.012Z
console.log(now.toDateString()); //Sat Jan 12 2019
console.log(now.toTimeString()); //23:32:39 GMT+0000 (Greenwich Mean Time)
console.log(date1); //2018-05-11T08:00:00.000Z
console.log(date1.toISOString()); //2018-05-11T08:00:00.000Z
console.log(date2); //2018-03-11T10:00:00.000Z
获取时间的一些方法 getFullYear(), 获取年
getDate()获取当天日期
getDay()获取当天星期
最好的方法是没有参数(parameter)的方法。用面向对象的好处就是在方法中较少使用parameter
//abstraction -hide the details,show the essentials
//类中的私有变量和私有方法
function Circle(radius) {
this.radius = radius; //这个是public的
let defaultLocation = {
x: 1,
y: 2
}; //这个是private property
let computeO = function (factor) { //这个是private method
console.log('private', factor);
}
this.draw = function () {
computeO(0.1); //在这里调用privat method
console.log('draw');
};
}
const circle = new Circle(20);
circle.draw();
js中prototype 就是parent,这个对象我们叫做objectBase,他是所有对象的父对象
简单一句话,es6更倾向使整个模块静态化,也就是新增加的一些新功能个人感觉让js更倾向于java的语法。
es6默认使用 use strict。
创建类:非常类似于java语法
class Circle { //class declaration
constructor(radius) {
this.radius = radius;
this.move = function () { //这里尽量不要定义方法吧。。。。
console.log('move');
};
}
// Instance Method
draw() { //类中不需要加function关键字
console.log("draw");
}
// static method 对象不能调用,只有类自己调用
static parse(str) {
console.log('parse');
}
}
const c = new Circle(1);
console.log(c.radius);
c.move();
c.draw();
//c.parse();调用会报错
Circle.parse();
// class expression
const Square = class {
}
ES6 中直接在想要export的地方加关键字export,而用import来导入modules
ES6中bable工具把ES6代码转化成所有浏览器可以执行的es5 JS语言,相当于一个转化器和编译器
而Bundle是用来把所有的js文件合并成一个Js文件的工具,现在最流行的是webpack。
npm是一个安装所有第三方工具和库的软件工具
package.js下的script 可以用npm run script中的关键字来实现script的内容