函数及面向对象

1. 定义函数

1. 定义方式一

绝对值函数

function abs(x){
if (x >= 0)
return x;
else
return -x;
}

一旦执行到return代表函数结束,返回结果

如果没有执行return,函数执行完也会返回结果,结果就是undefined

2. 定义方式二

var abs = function(x){
if (x >= 0)
return x;
else
return -x;
}

function(x){......}这是一个匿名函数,但是可以吧结果赋给abs,通过abs就可以调用函数!

方式一和方式二等效!

2. 调用函数

abs(10);

1. 参数问题

JavaScript可以传任意个参数,也可以不传参数

参数进来是否存在的问题?

假设不存在参数,如何规避?

function abs(x){
//手动抛出异常来判断
if (typeof x !== 'number'){
throw 'Not a Number'
}
if (x >= 0)
return x;
else
return -x;
}

2. arguments

arguments是一个JS免费赠送的关键字

代表传递进来的所有的参数,是一个数组

function abs(x){
console.log('x => ' + x); for (var i = 0; i < arguments.length; i++){
console.log(arguments[i]);
} if (x >= 0)
return x;
else
return -x;
}

问题:argument会包含所有的参数,我们有时候想使用多余的参数来进行附加操作,需要排除已有的参数

3. rest

以前:

function aaa(a, b) {
console.log("a=>" + a);
console.log("b=>" + b);
if (arguments.length > 2){
for (var i = 2; i < arguments.length; i++) {
var arg = arguments[i];
console.log(arg);
}
}
}

ES6引入的新特性,获取除了已经定义的参数之外的所有的参数

function aaa(a, b,...rest) {
console.log("a=>" + a);
console.log("b=>" + b);
console.log(rest);
}

rest参数只能写在最后面,必须用...标识

3. 变量的作用域

1 . var的作用域

在JavaScript中,var定义的变量实际是有作用域的

假设在函数体中声明,则在函数体外不可以使用(非要想实现的话,可以研究一下闭包

function qj() {
var x = 1;
x = x + 1;
}
x = x + 2; //UNcaught ReferenceError: x is not defined

如果连个函数使用了相同的变量名,只要在函数内部,就不冲突

function qj() {
var x = 1;
x = x + 1;
}
function qj2() {
var x = 'A';
x = x + 1;
}

内部函数可以访问外部函数的成员,反之则不行

function qj() {
var x = 1;
//内部函数可以访问外部函数的成员,反之则不行
function qj2() {
y = x + 1;
}
var z = y + 1;
}

假设,内部函数变量和外部函数的变量重名

function qj() {
var x = 1; function qj2() {
var x = 'A';
console.log('inner' + x);
}
console.log('outer' + x);
qj2();
}
qj();

在JavaScript中,函数查找变量从自身函数开始,由内向外查找。假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量

2. 提升变量的作用域

function qj() {
var x = 'x' + y;
console.log(x);
var y = 'y';
}
qj();

结果: x undefined

说明,js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值

相当于

function qj() {
var y; var x = 'x' + y;
console.log(x);
y = 'y';
}
qj();

这个是在JavaScript建立之初就存在的特性。养成规范:所有哦的变量定义都放在函数的头部,不要乱放,便于代码维护

function qj2 {
var x = 1,
y = x + 1;
z, i; //undefined //之后随意用 }

3. 全局函数

//全局变量
x = 1; function f() {
console.log(x);
}
f();
console.log(x);

全局对象 windows

var x = 'xxx';
alert(x);
alert(window.x); //默认所有的全局变量,都会自动绑定在window对象下

alert()这个函数,本身也是window的变量

JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内查找,就会向外查找,如果在全局作用域都没有找到,报错ReferenceError

4. 规范

由于我们所以的全局变量都会绑定到我们的window上。如果不同的js文件使用了相同的全局变量,如何能够减少冲突?

//唯一全局变量
var WangApp = {};
//定义全局变量
WangApp.name = 'Wang';
WangApp.add = function (a, b) {
return a + b;
}

把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题!

5. 局部作用域let

function add() {
for (var i = 0; i < 100; i++) {
console.log(i);
}
console.log(i + 1); //问题:i 出了这个作用域还可以使用?
}

ES6引入了let关键字,解决具备作用于冲突的问题

function add() {
for (let i = 0; i < 100; i++) {
console.log(i);
}
console.log(i + 1); //问题:i 出了这个作用域还可以使用?
}

建议大家都使用let去定义局部作用域的变量

6 .常量const

在ES6之前,常量的定义方法:只有用全部大写字母命名的变量就是常量(约定),建议不要修改这样的变量的值

var PI = '3.14';		//如果不按照约定,可以改变这个值

在ES6引入了常量关键字const

const PI = '3.14';		//只读变量,后面修改会报错

4. 方法

1. 定义方法

var wang = {
name: 'Wang',
birth: 2000,
//方法
age: function (){
//今年 - 出生的年
var now = new Date().getFullYear(); //变量补全 Ctrl alt V
return now - this.birth;
}
}
//属性
wang.name
//方法,一定要带()
wang.age()

2. this.代表什么?

function getAge() {
//今年 - 出生的年
var now = new Date().getFullYear(); //变量补全 Ctrl alt V
return now - this.birth;
}
var wang = {
name: 'Wang',
birth: 2000,
//方法
age: getAge
}
//wang.age() ok
//getAge() NaN 此时getAge()指向window对象(全局)

this是无法指向的,是默认指向调用它的那个对象

3. apply

在js中可以控制this的指向

function getAge() {
//今年 - 出生的年
var now = new Date().getFullYear(); //变量补全 Ctrl alt V
return now - this.birth;
}
var wang = {
name: 'Wang',
birth: 2000,
//方法
age: getAge
}
//wang.age() ok
//getAge() NaN 此时getAge()指向window对象(全局)
getAge.apply(wang, []); //this 指向了wang这个对象,参数为空

方法不调用不带()

5. 内部对象

标准对象

typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof NaN
"number"
typeof []
"object"
typeof {}
"object"
typeof Math.abs
"function"
typeof undefined
"undefined"

1. Date

1. 基本使用

var date = new Date();
date.getFullYear(); //年
date.getMonth(); //月 0~11 代表月
date.getDate(); //日
date.getDay(); //星期几
date.getHours(); //时
date.getMinutes(); //分
date.getSeconds(); //秒
date.getTime(); //时间戳 全世界统一 1970 1.1 0:00:00 毫秒数
console.log(new Date(1596607471140)); //时间戳转为时间

2. 转换

date = new Date(1596607471140)
//Wed Aug 05 2020 14:04:31 GMT+0800 (中国标准时间)
date.toLocaleString(); //以字符串的形式返回本地时间,注意,调用是一个方式,不是一个属性!
//"2020/8/5 下午2:04:31"
date.toGMTString(); //以字符串的形式返回GMT时间
//"Wed, 05 Aug 2020 06:04:31 GMT"

2. JSON

1. JSON是什么

早期,所有数据传输习惯使用XML文件!

  • JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在JavaScript中,一切皆为对象,任何js支持的类型都可以用JSON来表示:number,string...

2.格式

  • 对象都用{}
  • 数组都用[]
  • 所有的键值对都使用 key:value

3. JSON字符串和JS对象的转化

var user = {
name: "wang",
age: 3,
sex: "男"
}
//对象转化为JSON字符串
var jsonUser = JSON.stringify(user);
//JSON字符串转换为对象 参数为JSON字符串
var obj = JSON.parse('{"name":"wang","age":3,"sex":"男"}');

4. JSON和JS对象的区别

var obj = {a: 'hello', b: 'hellob'};
var json = '{"a"; 'hello', "b": 'hellob'}';

3. Ajax

  • 原生的JS写法 xhr 异步请求
  • jQuery 封装好的方法 $("#name").ajax(''')
  • axios 请求

6. 面向对象编程

1. 什么是面向对象

JavaScript、Java、C#...面向对象;

JavaScript有些区别

  • 类:模板

  • 对象:具体实例

在JavaScript中,这个需要换一下思维方式

2. 原型对象

var Student = {
name: "wang",
age: 3,
run: function () {
console.log(this.name + " r
}
};
var xiaoming = {
name: "xiaoming"
};
var Bird = {
fly: function () {
console.log(this.name + " f
}
}
//小明的原型是Student
xiaoming.__proto__ = Student;

3. class继承

class关键字是在ES6引入的

1. 定义一个类

类中有属性和方法

//定义一个学生的类
class Student{
//构造器
constructor(name) {
this.name = name;
}
hello() {
alert('hello');
}
} var xiaoming = new Student("xiaoming");
var xiaohong = new Student("xiaohong");
xiaoming.hello();

2. 继承

class Student{
//构造器
constructor(name) {
this.name = name;
}
hello() {
alert('hello');
}
}
class Pupil extends Student{
constructor(name, grade) {
super(name);
this.grade = grade;
}
myGrade() {
alert("我是一名小学生");
}
}
var xiaoming = new Student("xiaoming");
var xiaohong = new Pupil("xiaohong", 1);

本质:查看对象原型

4. 原型链

_photo_:

JavaScript函数及面向对象的更多相关文章

  1. JavaScript函数与面向对象

    一.JS面向对象 function Func(name,age){ //this = obj this.Name = name; this.Age = age; } obj = new Func('r ...

  2. 简单介绍Javascript匿名函数和面向对象编程

    忙里偷闲,简单介绍一下Javascript中匿名函数和闭包函数以及面向对象编程.首先简单介绍一下Javascript中的密名函数. 在Javascript中函数有以下3中定义方式: 1.最常用的定义方 ...

  3. JavaScript函数、闭包、原型、面向对象

    JavaScript函数.闭包.原型.面向对象 断言 单元测试框架的核心是断言方法,通常叫assert(). 该方法通常接收一个值--需要断言的值,以及一个表示该断言目的的描述. 如果该值执行的结果为 ...

  4. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  5. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  6. JavaScript语言精粹读书笔记 - JavaScript函数

    JavaScript是披着C族语言外衣的LISP,除了词法上与C族语言相似以外,其他几乎没有相似之处. JavaScript 函数: 函数包含一组语句,他们是JavaScript的基础模块单元,用于代 ...

  7. 详解Javascript 函数声明和函数表达式的区别

    Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装.继承等,也可以让代码得到复用.但事物都有两面性,Javascrip ...

  8. 第八章:Javascript函数

    函数是这样一段代码,它只定义一次,但可能被执行或调用任意次.你可能从诸如子例程(subroutine)或者过程(procedure)这些名字里对函数概念有所了解. javascript函数是参数化的: ...

  9. 【JavaScript】使用面向对象的技术创建高级 Web 应用程序

    本文讨论: JavaScript 是基于原型的语言 用 JavaScript 进行面向对象的编程 JavaScript 编码技巧 JavaScript 的未来 本文使用了以下技术: JavaScrip ...

随机推荐

  1. Java Redis系列2 (redis的安装与使用+redis持久化的实现))

    Java Redis系列2 (redis的安装与使用+redis持久化的实现) 什么是Redis? Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50 ...

  2. JavaScript String.prototype 原型

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  3. 下载的附件名总乱码?你该去读一下 RFC 文档了!

    纸上得来终觉浅,绝知此事要躬行 Web 开发过程中,相信大家都遇到过附件下载的场景,其中,各浏览器下载后的文件名中文乱码问题或许一度让你苦恼不已. 网上搜索一下,大部分都是通过Request Head ...

  4. Mybatis-plus 实体类新增属性,使用实体类执行sql操作时忽略该属性 注解

    @TableField(exist = false) 注解加载bean属性上,表示当前属性不是数据库的字段,但在项目中必须使用,这样在新增等使用bean的时候,mybatis-plus就会忽略这个,不 ...

  5. 深入理解 Java 内存模型 JMM 与 volatile

    Java 内存模型(Java Memory Model,简称 JMM)是一种抽象的概念,并不真实存在,它描述的是一组规范或者规则,通过这种规范定义了程序中各个变量(包括实例字段.静态字段和构成数组对象 ...

  6. python 03 常用操作符

    1. e记法,科学计数法. AeB   A,B为整数,A*10的B次方. 2. 逻辑运算,真为1,假为0,最好不使用这个计算 true(1)    false(0) true+true=2 3.类型转 ...

  7. Linux上通过curl发送PUT和POST请求

    通常而言,我们都使用curl发送get请求,但是还是可以使用它发送一些其他类型的请求的,如PUT/POST 只需要使用-X参数即可:

  8. Java并发篇

    Java并发篇 作者:星晴(当地小有名气,小到只有自己知道的杰伦粉) 1. Java锁 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 Synchronized 同步锁 1.4.1 核心组件 ...

  9. Docker 学习笔记(一)

    Docker 入门 Docker 学习 概述 安装 命令 镜像命令 容器命令 操作命令 Docker 镜像 容器数据卷 DockerFile Docker网络原理 IDEA 整合Docker 单机版D ...

  10. GPU虚拟机创建时间深度优化

    ​桔妹导读:GPU虚拟机实例创建速度慢是公有云面临的普遍问题,由于通常情况下创建虚拟机属于低频操作而未引起业界的重视,实际生产中还是存在对GPU实例创建时间有苛刻要求的业务场景.本文将介绍滴滴云在解决 ...