[].length = 0

本文介绍了JavaScript中清空数组的两种常见方法及其区别:设置数组长度为0和直接赋值为空数组。通过实例展示了这两种方法对引用的影响不同。

置空数组有两种方法:

var arr = [ 1,2,3,4 ];
arr.length = 0;//方法一
//方法二 arr = [];

这两种方法有细微的不同:

var arr   = [ 1,2,3,4 ],
      arr2 = arr;
arr.length = 0;
console.log(arr,arr2);//打印结果[] []

var arr   = [ 1,2,3,4 ],
      arr2 = arr;
arr = [];
console.log(arr,arr2);//打印结果[] [ 1,2,3,4]

可见,方法一中arr2被置空,方法二中arr2没有被置空

到底使用哪一种方式?仁者见仁智者见智吧。

//顺序串基本运算的算法#include <stdio.h>#define MaxSize 100typedef struct{ char data[MaxSize]; //串中字符 int length; //串长} SqString; //声明顺序串类型void StrAssign(SqString *s, char cstr[]) //字符串常量赋给串s{ int i; for (i = 0; cstr[i] != '\0'; i++) s->data[i] = cstr[i]; s->length = i;}void DestroyStr(SqString *s) //销毁串{ // 在顺序存储中,通常不需要特殊操作 // 可以重置长度或清空数据 s->length = 0;}void StrCopy(SqString *s, SqString t) //串复制{ for (int i = 0; i < t.length; i++) s->data[i] = t.data[i]; s->length = t.length;}int StrEqual(SqString s, SqString t) //判串相等{ int same = 1; if (s.length != t.length) //长度不相等时返回0 same = 0; else for (int i = 0; i < s.length; i++) if (s.data[i] != t.data[i]) //有一个对应字符不相同时返回假 { same = 0; break; } return same;}int StrLength(SqString s) //求串长{ return s.length;}SqString Concat(SqString s, SqString t) //串连接{ SqString str; int i; str.length = s.length + t.length; for (i = 0; i < s.length; i++) //s.data[0..s.length-1]→str str.data[i] = s.data[i]; for (i = 0; i < t.length; i++) //t.data[0..t.length-1]→str str.data[s.length + i] = t.data[i]; return str;}SqString SubStr(SqString s, int i, int j) //求子串{ SqString str; int k; str.length = 0; if (i <= 0 || i > s.length || j < 0 || i + j - 1 > s.length) return str; //参数不正确时返回空串 for (k = i - 1; k < i + j - 1; k++) //s.data[i..i+j]→str str.data[k - i + 1] = s.data[k]; str.length = j; return str;} SqString InsStr(SqString s1, int i, SqString s2) //插入串{ int j; SqString str; str.length = 0; if (i <= 0 || i > s1.length + 1) //参数不正确时返回空串 return str; for (j = 0; j < i - 1; j++) //s1.data[0..i-2]→str str.data[j] = s1.data[j]; for (j = 0; j < s2.length; j++) //s2.data[0..s2.length-1]→str str.data[i + j - 1] = s2.data[j]; for (j = i - 1; j < s1.length; j++) //s1.data[i-1..s1.length-1]→str str.data[s2.length + j] = s1.data[j]; str.length = s1.length + s2.length; return str;}SqString DelStr(SqString s, int i, int j) //串删去{ int k; SqString str; str.length = 0; if (i <= 0 || i > s.length || i + j > s.length + 1) //参数不正确时返回空串 return str; for (k = 0; k < i - 1; k++) //s.data[0..i-2]→str str.data[k] = s.data[k]; for (k = i + j - 1; k < s.length; k++) //s.data[i+j-1..s.length-1]→str str.data[k - j] = s.data[k]; str.length = s.length - j; return str;}SqString RepStr(SqString s, int i, int j, SqString t) //子串替换{ int k; SqString str; str.length = 0; if (i <= 0 || i > s.length || i + j - 1 > s.length) //参数不正确时返回空串 return str; for (k = 0; k < i - 1; k++) //s.data[0..i-2]→str str.data[k] = s.data[k]; for (k = 0; k < t.length; k++) //t.data[0..t.length-1]→str str.data[i + k - 1] = t.data[k]; for (k = i + j - 1; k < s.length; k++) //s.data[i+j-1..s.length-1]→str str.data[t.length + k - j] = s.data[k]; str.length = s.length - j + t.length; return str;}void DispStr(SqString s) //输出串s{ if (s.length > 0) { for (int i = 0; i < s.length; i++) printf("%c", s.data[i]); printf("\n"); }}int main(){ SqString s, s1, s2, s3, s4; printf("顺序串的基本运算如下:\n"); printf(" (1)建立串s和串s1\n"); StrAssign(&s, "hello world"); //补充代码1:与建立串s一样,建立串s1 printf(" (2)输出串s:"); DispStr(s); printf(" (3)串s的长度:%d\n", StrLength(s)); printf(" (4)在串s的第6个字符位置插入串s1而产生串s2\n"); //补充代码2:在串s的第6个字符位置插入串s1而产生串s2,函数:InsStr() printf(" (5)输出串s2:"); DispStr(s2); printf(" (6)删除串s第2个字符开始的3个字符而产生串s2\n"); s2 = DelStr(s, 2, 3); printf(" (7)输出串s2:"); DispStr(s2); printf(" (8)将串s第2个字符开始的3个字符替换成串s1而产生串s2\n"); s2 = RepStr(s, 2, 3, s1); printf(" (9)输出串s2:"); DispStr(s2); printf(" (10)提取串s的第7个字符开始的2个字符而产生串s3\n"); //补充代码3:提取串s的第7个字符开始的2个字符而产生串s3,函数:SubStr() printf(" (11)输出串s3:"); DispStr(s3); printf(" (12)将串s1和串s2连接起来而产生串s4\n"); s4 = Concat(s1, s2); printf(" (13)输出串s4:"); DispStr(s4); DestroyStr(&s); DestroyStr(&s1); DestroyStr(&s2); DestroyStr(&s3); DestroyStr(&s4); return 1;}
最新发布
11-11
以下是补全后的代码,包含建立串`s1`、在串`s`的第 6 个字符位置插入串`s1`产生串`s2`、提取串`s`的第 7 个字符开始的 2 个字符产生串`s3`的操作: ```c #include <stdio.h> #define MaxSize 100 typedef struct { char data[MaxSize]; // 串中字符 int length; // 串长 } SqString; // 声明顺序串类型 void StrAssign(SqString *s, char cstr[]) { // 字符串常量赋给串 s int i; for (i = 0; cstr[i] != '\0'; i++) s->data[i] = cstr[i]; s->length = i; } void DestroyStr(SqString *s) { // 销毁串 // 在顺序存储中,通常不需要特殊操作 // 可以重置长度或清空数据 s->length = 0; } void StrCopy(SqString *s, SqString t) { // 串复制 for (int i = 0; i < t.length; i++) s->data[i] = t.data[i]; s->length = t.length; } int StrEqual(SqString s, SqString t) { // 判串相等 int same = 1; if (s.length != t.length) // 长度不相等时返回 0 same = 0; else for (int i = 0; i < s.length; i++) if (s.data[i] != t.data[i]) // 有一个对应字符不相同时返回假 { same = 0; break; } return same; } int StrLength(SqString s) { // 求串长 return s.length; } SqString Concat(SqString s, SqString t) { // 串连接 SqString str; int i; str.length = s.length + t.length; for (i = 0; i < s.length; i++) // s.data[0..s.length-1]→str str.data[i] = s.data[i]; for (i = 0; i < t.length; i++) // t.data[0..t.length-1]→str str.data[s.length + i] = t.data[i]; return str; } SqString SubStr(SqString s, int i, int j) { // 求子串 SqString str; int k; str.length = 0; if (i <= 0 || i > s.length || j < 0 || i + j - 1 > s.length) return str; // 参数不正确时返回空串 for (k = i - 1; k < i + j - 1; k++) // s.data[i..i+j]→str str.data[k - i + 1] = s.data[k]; str.length = j; return str; } SqString InsStr(SqString s1, int i, SqString s2) { // 插入串 int j; SqString str; str.length = 0; if (i <= 0 || i > s1.length + 1) // 参数不正确时返回空串 return str; for (j = 0; j < i - 1; j++) // s1.data[0..i-2]→str str.data[j] = s1.data[j]; for (j = 0; j < s2.length; j++) // s2.data[0..s2.length-1]→str str.data[i + j - 1] = s2.data[j]; for (j = i - 1; j < s1.length; j++) // s1.data[i-1..s1.length-1]→str str.data[s2.length + j] = s1.data[j]; str.length = s1.length + s2.length; return str; } SqString DelStr(SqString s, int i, int j) { // 串删去 int k; SqString str; str.length = 0; if (i <= 0 || i > s.length || i + j > s.length + 1) // 参数不正确时返回空串 return str; for (k = 0; k < i - 1; k++) // s.data[0..i-2]→str str.data[k] = s.data[k]; for (k = i + j - 1; k < s.length; k++) // s.data[i+j-1..s.length-1]→str str.data[k - j] = s.data[k]; str.length = s.length - j; return str; } SqString RepStr(SqString s, int i, int j, SqString t) { // 子串替换 int k; SqString str; str.length = 0; if (i <= 0 || i > s.length || i + j - 1 > s.length) // 参数不正确时返回空串 return str; for (k = 0; k < i - 1; k++) // s.data[0..i-2]→str str.data[k] = s.data[k]; for (k = 0; k < t.length; k++) // t.data[0..t.length-1]→str str.data[i + k - 1] = t.data[k]; for (k = i + j - 1; k < s.length; k++) // s.data[i+j-1..s.length-1]→str str.data[t.length + k - j] = s.data[k]; str.length = s.length - j + t.length; return str; } void DispStr(SqString s) { // 输出串 s if (s.length > 0) { for (int i = 0; i < s.length; i++) printf("%c", s.data[i]); printf("\n"); } } int main() { SqString s, s1, s2, s3, s4; printf("顺序串的基本运算如下:\n"); printf(" (1)建立串 s 和串 s1\n"); StrAssign(&s, "hello world"); StrAssign(&s1, "abc"); // 建立串 s1 printf(" (2)输出串 s:"); DispStr(s); printf(" (3)串 s 的长度:%d\n", StrLength(s)); printf(" (4)在串 s 的第 6 个字符位置插入串 s1 而产生串 s2\n"); s2 = InsStr(s, 6, s1); // 在串 s 的第 6 个字符位置插入串 s1 而产生串 s2 printf(" (5)输出串 s2:"); DispStr(s2); printf(" (6)删除串 s 第 2 个字符开始的 3 个字符而产生串 s2\n"); s2 = DelStr(s, 2, 3); printf(" (7)输出串 s2:"); DispStr(s2); printf(" (8)将串 s 第 2 个字符开始的 3 个字符替换成串 s1 而产生串 s2\n"); s2 = RepStr(s, 2, 3, s1); printf(" (9)输出串 s2:"); DispStr(s2); printf(" (10)提取串 s 的第 7 个字符开始的 2 个字符而产生串 s3\n"); s3 = SubStr(s, 7, 2); // 提取串 s 的第 7 个字符开始的 2 个字符而产生串 s3 printf(" (11)输出串 s3:"); DispStr(s3); printf(" (12)将串 s1 和串 s2 连接起来而产生串 s4\n"); s4 = Concat(s1, s2); printf(" (13)输出串 s4:"); DispStr(s4); DestroyStr(&s); DestroyStr(&s1); DestroyStr(&s2); DestroyStr(&s3); DestroyStr(&s4); return 1; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值