美文网首页让前端飞程序员
关于JS的可选参数,该知道的都在这里了

关于JS的可选参数,该知道的都在这里了

作者: turtleeeee | 来源:发表于2017-06-26 09:50 被阅读1674次

前言

我是一枚土生土长的iOS程序猿,之所以会写关于JS的文章,主要是因为我最近在负责组里的部分运营需求,所以写前端也逐渐比较多,于是乎学习JS势在必行,所以就开写了。

正文

我们都知道函数是js里的一等公民,并且在js里,你声明一个函数——你可以定制多个参数,与此同时,你在调用该函数的时候不需要传入所有的参数,它就能正常执行——只不过这些参数默认就是undefined而已。所以似乎js的函数天生就带有可选参数这个功能,只不过在你不进行定制的时候它们都具有一个“统一”的值罢了。
所以,我们也知道,除非函数里就实现了针对某个参数为undefined时的行为,让参数为undefined是比较危险的。

该如何实现函数内的可选参数,我们将用js里的构造方法来举例(假如我们要实现一个Person类):

function Person(name, age, height, weight) {
    this.name = name;
    this.age = age;
    this.height = height;
    this.weight = weight;
}

通常我们都会这么实现,现在假想我们要将heightweight参数设为可选参数,可选参数的实质就是令未被赋值的参数具有一个默认值,直白地处理,我们可以写成这样:

function Person(name, age, height, weight) {
    var nHeight = height || 0;
    var nWeight = weight || 0; 
    this.name = name;
    this.age = age;
    this.height = nHeight ;
    this.weight = nWeight ;
}

但是因为我们这里的参数只是简单的赋值给属性,所以我们可以这么写:

function Person(name, age, height, weight) {
    this.name = name;
    this.age = age;
    this.height = height || 0;
    this.weight = weight || 0;
}

面对这样的实现,不难发现它还有点问题——这种实现永远只能把可选参数连续地声明在函数的末端,必要的参数必须得放前面,因为它只能这样生成:

var person = new Person("Turtle", 23);

假如我是ageweight为可选参数呢?

function Person(name, age, height, weight) {
    this.name = name;
    this.age = age || 0;
    this.height = height;
    this.weight = weight || 0;
}
// 我就不能这样生成Person对象了
var person = new Person("Turtle", "170cm");

因为这样子赋值,没法让170cm赋到height属性上,只会赋到age属性上,这显然不是我们想要的。

一种简便的解决方法是不定义这么多的参数赋值,而统一使用一个对象来进行赋值:

function Person(options) {
    this.name = options.name;
    this.age = options.age || 0;
    this.height = options.height;
    this.weight = options.weight || 0;
}

var options = {
    name: "Turtle",
    height: "170cm",
};
var person = new Person(options);
//or
var person2 = new Person({
    name: "Turtle",
    height: "170cm",
});

而在es6里,它支持了为参数提供默认值,所以你可以这么干:

function Person({name, age = 0, height, weight = 0} = {}) {
    this.name = name;
    this.age = age;
    this.height = height;
    this.weight = weight;
}
// 效果和上面一致

相关文章

  • 关于JS的可选参数,该知道的都在这里了

    前言 我是一枚土生土长的iOS程序猿,之所以会写关于JS的文章,主要是因为我最近在负责组里的部分运营需求,所以写前...

  • Dart语法之可选参数

    Dart方法有两种类型的参数:必需的和可选的。必需的我们一般都知道,这里主要分析可选参数。 如果同时包含可选参数和...

  • 2.Dart面向对象

    函数 命名可选参数{} 位置可选参数[] 作用域定义:与js的作用域一致,层层向上找。 Dart函数闭包 js函数...

  • Swift 的 Optional错误理解

    Swift 参数声明的时候使用 ! ,? 说明该参数是可选的。默认情况下为 nil以前认为只有? 修饰的才是可选的。

  • Dart6(六)函数的定义 可选参数 默认参数 命名参数 箭头函

    一、函数的定义 如同 js二、可选参数String printUser (String name, [ int a...

  • React-Native 打离线包

    react-native bundle Options(可选参数说明): --entry-file :JS根目...

  • 磨刀- Dart 函数

    ✨✨✨✨✨ 魏什么_多喝水 Flutter 之路 声明 参数 可选参数 可选命名参数: 可选位置参数

  • Flutter-选填参数

    可选命名参数用 {}表示可选命名的参数必须要写参数名,可以跳过一些参数 调用方法: 可选位置参数用[]表示可选位置...

  • Flutter 中的一些区别

    1、可选的位置参数和可选的命名参数 可先的位置参数在 Flutter 中使用 [] 标记为可选位置参数,并放到参数...

  • 2.函数的定义及函数的参数

    函数的定义 函数的参数 (必传) 函数的可选参数 可选参数 使用 '?'可选参数必须配置到参数的后面 函数的默认参...

网友评论

    本文标题:关于JS的可选参数,该知道的都在这里了

    本文链接:https://www.haomeiwen.com/subject/flrlcxtx.html